Java检测类是否是代理
是否可以检测类是否是代理 ( 动态 , cglib或其他 )?
让类A
和B
实现公共接口I
然后我需要定义一个例程的classEquals
签名
public boolean classEquals(Class a, Class 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代理。
Proxy.isProxyClass(Foo.class)
如果instanceof
是可接受的,那么clazz.isInstance(b)
应该可以工作。
编辑:
我在阅读您修改后的答案之前写过。 类也有类似的方法:
b.isAssignableFrom(a)
不,通常你无法判断对象是否是代理。 而这仅仅是因为很难定义什么是代理。 你可以实现一个接口并将其用作代理,你可以自己动手使用cglib,asm,javassist,plastic,jdk或者生成字节码。 它与加载xxx.class文件没什么不同。
您正在考虑的可能是检查对象是否由cglib,asm或其他特定库创建。 在这种情况下 – 通常是的。 大多数图书馆都有自己可以发现的指纹。 但总的来说,这是不可能的