4

フレームワークのようなものを書こうとしています。コンピューター上の特定のフォルダーを検索し、そこにあるインターフェイスを実装するすべてのクラス ファイルを取得できるようにする必要があります。フォルダーをスキャンしてすべてのクラスファイルをチェックする方法は知っていますが、読み取りクラスがインターフェイスを実装しているかどうかを確認できません。

if (Game.class.isAssignableFrom(classInFolder))
    {
        //Do sth here
}

これは私が試したアプローチの 1 つですが、if 句に飛び込むことはありません - Game is my Interface

public interface Game {

public void startAlgorithm();

}

classInFolder は、フォルダーから取得した Class です。私がいくつかのライブラリインターフェースで同じことをやろうとすると面白いことです.Serializableがうまくいくとしましょう.試してみました. ましてやそんなこと書いたら

Type[] type = classInFolder.getGenericInterfaces();
for (int i = 0;i<type.length;++i)
{
    System.out.println("interface = " + type[i]);
    if (type[i] instanceof Game){
    System.out.println("It is");
    }
}

私は自分のコンソール出力を手に入れました - interface = mypackage.Game しかし、「それは」という出力はありませんでした。使用しようとしたクラスの独自の注釈でも同じことが起こりました.クラスがインターフェイスを実装しているかどうかを確認することはできませんが、それらがいくつかのライブラリのインターフェイスである場合は機能します。プロジェクトをTomcat v 7.0にデプロイします。すべてがSpringを使用してEclipse上のJava 7でビルドされています。

何が起こっているのかについてのアイデアに感謝します。

4

4 に答える 4

2

クラスに異なるをロードしていると思われますClassLoader。あるクラスローダーによってロードされたクラスは、別のクラスローダーによってロードされた同じクラスと同じではありません。

同じでロードしてみてくださいClassLoader


Object a1 = new ClassLoader() {}.loadClass("A");
Object a2 = new ClassLoader() {}.loadClass("A");

return a1.getClass().equals(a2.getClass());

を返しfalseます。

于 2012-11-12T15:47:14.417 に答える
2

Type インスタンスを使用しているときに、目的のクラスのインスタンスを instanceof 演算子の左側で使用する必要があるため、例には「It is」出力はありません。

Class.getInterfaces()を使用して、クラスによって実装されたインターフェースを取得し、getInterfaces() メソッドによって返された配列でインターフェースを探してみてください。

于 2012-11-12T15:49:44.427 に答える
2

instanceof演算子を使用して、インターフェイスではなくオブジェクト インスタンスをチェックしています。

インターフェイスを確認するには、インターフェイスが複数ある可能性があるため、取得してリストを繰り返し、次のようにタイプを一致させます。

        for (Class ifce : type[i].getClass().getInterfaces()) {
           if (ifce.equals(Game.class)) {
                System.out.println("It is");
           }
         }
于 2012-11-12T15:56:27.327 に答える
1

クラスはおそらくtomcatGameクラスローダーによってロードされます。

おそらくclassInFolder、独自のカスタム クラス ローダーによってロードされます。

1 番目のローダーが 2 番目のローダーの親であることを確認する必要があります

ClassLoader parent = Game.class.getClassLoader();

new MyClassLoader(parent, ...)
于 2012-11-12T16:49:00.393 に答える