Java检测类是否是代理

时间:2011-09-21 18:07:16

标签: java testing proxy mocking cglib

是否可以检测某个类是代理动态 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 代理。

3 个答案:

答案 0 :(得分:10)

答案 1 :(得分:1)

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

修改
我在阅读您修改后的答案之前写过。类也有类似的方法:

b.isAssignableFrom(a)

答案 2 :(得分:0)

不,通常你无法分辨对象是否是代理。而这仅仅是因为很难定义什么是代理。你可以实现一个接口并将其用作代理,你可以自己动手使用cglib,asm,javassist,plastic,jdk或者生成字节码。它与加载xxx.class文件没什么不同。

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