Java检测类是否是代理
是否可以检测一个类是否是代理(动态、cglib或其他)?
让类A
和B
实现一个公共接口I
。然后我需要定义一个签名例程 classEquals
public boolean classEquals(Class<? extends I> a, Class<? extends I> b);
,以便仅当 a.equals(b)
或 Proxy 时它才计算为 true (a).equals(b)
,其中 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 > 代理。
Is it possible to detect if a class is a proxy (dynamic, cglib or otherwise)?
Let classes A
and B
implement a common interface I
. Then I need to define a routine classEquals
of signature
public boolean classEquals(Class<? extends I> a, Class<? extends I> b);
such that it evaluates to true only if a.equals(b)
or Proxy(a).equals(b)
, where Proxy(a)
denotes a dynamic proxy of type A
(dynamic, cglib or otherwise).
With the assistance of @Jigar Joshi
, this is what it looks like so far:
public boolean classEquals(Class a, Class b) {
if (Proxy.isProxyClass(a)) {
return classEquals(a.getSuperclass(), b);
}
return a.equals(b);
}
The problem is that it doesn't detect e.g., a CGLIB proxy.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
代理.isProxyClass(Foo.class)
Proxy.isProxyClass(Foo.class)
不,一般来说你无法判断一个对象是否是代理。这仅仅是因为很难定义什么是代理。您可以实现一个接口并将其用作代理,您可以使用 cglib、asm、javassist、 Plastic、jdk 或自行动态生成字节码。它与加载 xxx.class 文件没有什么不同。
您正在考虑的可能是检查对象是否是由 cglib、asm 或其他特定库创建的。在这种情况下 - 通常是的。大多数图书馆都有自己可以发现的指纹。但一般来说这是不可能的
no, in general you can't tell if an object is a proxy. and that's simply because it's hard to define what is a proxy. you can implement an interface and use it as a proxy, you can use cglib, asm, javassist, plastic, jdk or generate bytecode on the fly by yourself. it is no different than loading xxx.class file.
what you are thinking about is probably checking if the object is created by cglib, asm or other specific library. in such case - usually yes. most libraries have their own fingerprint that can be discovered. but in general it's not possible
如果
instanceof
可接受,则clazz.isInstance(b)
应该也可以工作。编辑:
我在阅读您修改后的答案之前写了这篇文章。对于类也有类似的方法:
b.isAssignableFrom(a)
If
instanceof
is acceptable, thenclazz.isInstance(b)
should work as well.Edit:
I wrote that before reading your modified answer. There is a similar method for classes as well:
b.isAssignableFrom(a)