是否可以检测某个类是代理(动态, cglib 还是否则)?
让类A
和B
实现公共接口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 代理。
答案 0 :(得分:10)
答案 1 :(得分:1)
答案 2 :(得分:0)
不,通常你无法分辨对象是否是代理。而这仅仅是因为很难定义什么是代理。你可以实现一个接口并将其用作代理,你可以自己动手使用cglib,asm,javassist,plastic,jdk或者生成字节码。它与加载xxx.class文件没什么不同。
您正在考虑的可能是检查对象是否由cglib,asm或其他特定库创建。在这种情况下 - 通常是的。大多数图书馆都有自己可以发现的指纹。但总的来说,这是不可能的