Java检测类是否是代理

发布于 2024-12-05 19:14:04 字数 790 浏览 1 评论 0原文

是否可以检测一个类是否是代理动态cglib其他)?

让类AB实现一个公共接口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 Aand 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

葵雨 2024-12-12 19:14:04

不,一般来说你无法判断一个对象是否是代理。这仅仅是因为很难定义什么是代理。您可以实现一个接口并将其用作代理,您可以使用 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

单挑你×的.吻 2024-12-12 19:14:04

如果 instanceof 可接受,则 clazz.isInstance(b) 应该也可以工作。

编辑:
我在阅读您修改后的答案之前写了这篇文章。对于类也有类似的方法:

b.isAssignableFrom(a)

If instanceof is acceptable, then clazz.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)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文