12

リフレクションを使用して、渡されたクラスがIsWdidgetインターフェイスを実装しているかどうかを判断しようとしています。

public boolean isAWidget(Class<?> clzz) {
    Class<?> runtimeClass = ClassLoader.getSystemClassLoader().loadClass(clzz.getName());
    Class<?>[] impls = runtimeClass.getInterfaces();
    for(Class<?> clz : impls)
        if(clz.getName().equals(IsWidget.class.getName()))
            return true;

    return false;
}

これは、これを決定するための最良/最も効率的な方法ですか? メソッドも表示されIsWidget.class.isAssignableFrom(Class<?>)ます...

4

4 に答える 4

14

isAssignableFromメソッドを使用してIsWidget、スーパーインターフェイスかどうかを判断します。

return IsWidget.class.isAssignableFrom(clzz);

上記のリンクされた Javadoc から引用するには:

この Class オブジェクトによって表されるクラスまたはインターフェースが、指定された Class パラメーターによって表されるクラスまたはインターフェースと同じであるか、そのスーパークラスまたはスーパーインターフェースであるかを判断します。

于 2013-05-03T17:07:04.973 に答える
1

getInterfaces()オブジェクトがある場合は、メソッドを使用できClassます。

    Class c[] = clzz.getInterfaces();   
    if(Arrays.asList(c).contains(IsWidget.class))
    {
        return true;
    }

getInterfaces メソッドは、 をClass表す の配列を提供しますinterfaces。または、次のように isAssignableFrom メソッドを使用することもできます。

IsWidget.class.isAssignableFrom(clzz);

をお持ちのObject場合は、メソッドを使用できますinstanceof

于 2013-05-03T17:08:42.380 に答える
1

1) これは意味がない

  Class<?> runtimeClass = ClassLoader.getSystemClassLoader().loadClass(clzz.getName());

任意のクラスでこれを試してください

    Class<?> runtimeClass = ClassLoader.getSystemClassLoader().loadClass(clzz.getName());
    System.out.println(runtimeClass == clzz);

あなたが得る

true

したがって、この行を削除して clzz を直接操作すると、すでにより効率的です

2)これを試してください

class X extends Thread {
}

public static void main(String[] args) throws ClassNotFoundException {
    System.out.print(Arrays.toString(X.class.getInterfaces()));
}

あなたが得る

[]

これは func が行っていることと似ていますが、実際には X は Runnable を実装しています

3)これは、クラスがインターフェースを実装しているかどうかを確認するための非常に効率的な1行のソリューションです

    System.out.print(Runnable.class.isAssignableFrom(X.class));

出力

true
于 2013-05-03T17:06:05.010 に答える
0

それが機能する場合、それは問題ないはずです。castクラスのメソッドを呼び出してClass、try and catch を実行することもできます。

于 2013-05-03T17:07:42.460 に答える