Java检测类是否是代理
是否可以检测类是否是代理(动态,cglib或否则) 让类Java检测类是否是代理,java,testing,proxy,mocking,cglib,Java,Testing,Proxy,Mocking,Cglib,是否可以检测类是否是代理(动态,cglib或否则) 让类A和B实现一个公共接口I。然后我需要定义签名的例程classEquals public boolean classEquals(Class<? extends I> a, Class<? extends I> b); 问题是它没有检测到例如CGLIB代理 如果instanceof是可接受的,那么也应该工作 编辑: 我是在读你修改后的答案之前写的。对于类也有类似的方法: 不,一般来说,您无法判断对象是否是代理。这仅仅
A
和B
实现一个公共接口I
。然后我需要定义签名的例程classEquals
public boolean classEquals(Class<? extends I> a, Class<? extends I> b);
问题是它没有检测到例如CGLIB代理 如果
instanceof
是可接受的,那么也应该工作
编辑:我是在读你修改后的答案之前写的。对于类也有类似的方法:
不,一般来说,您无法判断对象是否是代理。这仅仅是因为很难定义什么是代理。您可以实现一个接口并将其用作代理,您可以使用cglib、asm、javassist、plastic、jdk或自己动态生成字节码。这与加载xxx.class文件没有什么不同
您考虑的可能是检查对象是否由cglib、asm或其他特定的库创建。在这种情况下-通常是的。大多数图书馆都有自己可以发现的指纹。但一般来说,在
测试方法中不可能,我假设代理(A.class)
为A返回一个代理对象。测试(new A(),A.class)
的结果应该是什么?@Arian,它的值应该为true,所以您不想检测代理,但您想查找类的实例,即使它们是由未知的模拟/代理框架生成的?实例的情况如何?@Arian,评论不错。虽然我使用的是类
而不是对象
,但不幸的是,它不允许我使用实例
CGLIB在自己的包中提供了一个代理.isproxy类
。这可能会检测到它们。很棒,因为它检测到一个DynamicProxy
,但似乎无法识别Mockito创建的CGLIB代理。doFoo.getClass().getName()
很有趣,但似乎无法很好地应用于比较。
public boolean classEquals(Class a, Class b) {
if (Proxy.isProxyClass(a)) {
return classEquals(a.getSuperclass(), b);
}
return a.equals(b);
}