【问题标题】:Java detect if class is a proxyJava检测类是否是代理
【发布时间】:2011-11-22 04:50:04
【问题描述】:

是否可以检测类是否是代理动态cglib否则)?

让类AB实现一个公共接口I。然后我需要定义一个签名的例程classEquals

public boolean classEquals(Class<? extends I> a, Class<? extends I> b);

只有当a.equals(b)Proxy(a).equals(b) 时,它才会评估为true,其中Proxy(a) 表示A 类型的动态代理(动态、cglib 或其他)。


@Jigar Joshi 的帮助下,目前是这样的:

public boolean classEquals(Class a, Class b) {
    if (Proxy.isProxyClass(a)) {
        return classEquals(a.getSuperclass(), b);
    }
    return a.equals(b);
}

问题是它没有检测到例如 CGLIB 代理。

【问题讨论】:

  • 在您的test 方法中,我想Proxy(A.class) 会为A 返回一个代理对象。test(new A(), A.class) 的结果应该是什么?
  • @Arian,它应该评估为真
  • 所以你不想检测代理,但你想找到一个类的实例,即使它们是由未知的模拟/代理框架生成的? instanceof呢?
  • @Arian,好评。虽然我正在使用Classes 而不是Objects,但不幸的是这不允许我使用instanceof
  • CGLIB 在自己的包中提供了Proxy.isProxyClass。这可能会检测到它们。

标签: java testing proxy mocking cglib


【解决方案1】:

【讨论】:

  • 很棒,因为它检测到了 DynamicProxy,但似乎无法识别 Mockito 创建的 CGLIB 代理。
  • Foo.getClass().getName()
【解决方案2】:

如果instanceof 可以接受,那么clazz.isInstance(b) 也应该可以工作。

编辑:
我在阅读您修改后的答案之前写了这个。类也有类似的方法:

b.isAssignableFrom(a)

【讨论】:

【解决方案3】:

不,通常您无法判断对象是否为代理。这仅仅是因为很难定义什么是代理。您可以实现一个接口并将其用作代理,您可以使用 cglib、asm、javassist、plastic、jdk 或自己动态生成字节码。和加载 xxx.class 文件没什么区别。

您正在考虑的可能是检查对象是否由 cglib、asm 或其他 特定 库创建。在这种情况下 - 通常是的。大多数图书馆都有自己的指纹可以被发现。但总的来说这是不可能的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    相关资源
    最近更新 更多