15

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

让类AB实现一个通用接口I。然后我需要定义一个classEquals签名例程

public boolean classEquals(Class<? extends I> a, Class<? extends I> b);

这样它只有在或时才计算为,其中表示类型的动态代理(动态、cglib 或其他)。a.equals(b)Proxy(a).equals(b)Proxy(a)A


在 的帮助下@Jigar Joshi,到目前为止是这样的:

public boolean classEquals(Class a, Class b) {
    if (Proxy.isProxyClass(a)) {
        return classEquals(a.getSuperclass(), b);
    }
    return a.equals(b);
}

问题是它没有检测到例如CGLIB代理。

4

3 回答 3

15

Proxy.isProxyClass(Foo.class)

于 2011-09-21T18:10:29.117 回答
1

如果instanceof可以接受,那么clazz.isInstance(b)也应该可以。

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

b.isAssignableFrom(a)

于 2011-09-21T18:54:09.010 回答
1

不,通常您无法判断对象是否是代理。这仅仅是因为很难定义什么是代理。您可以实现一个接口并将其用作代理,您可以使用 cglib、asm、javassist、plastic、jdk 或自行生成字节码。这与加载 xxx.class 文件没有什么不同。

您正在考虑的可能是检查对象是否由 cglib、asm 或其他特定库创建。在这种情况下 - 通常是的。大多数图书馆都有自己的指纹可以被发现。但总的来说这是不可能的

于 2013-05-24T18:11:27.380 回答