15

クラスがプロキシ動的cglibなど)であるかどうかを検出することは可能ですか?

クラスAB作成し、共通のインターフェースを実装しましょうIclassEquals次に、署名のルーチンを定義する必要があります

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

またはの場合にのみtrueと評価されるようになります。ここで、はタイプ(dynamic、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 に答える