0

クラスのリストを検索して、クラスに注釈があるかどうかを確認しています。これはコードです:

                        if (clazz.getAnnotations().length > 0){
                            System.out.println(clazz.getAnnotations()[0]);
                        }
                        if (clazz.isAnnotationPresent(Manifest.class)){
                            System.out.println(clazz.getName());
                        }

最初の if ステートメントはデバッグ用です。1 つのクラスが次のように出力します。

@bot.script.Manifest(description=test, version=1.0, name=test)

これは Manifest.class とまったく同じですが、なぜ clazz.isAnnotationPresent が機能しないのでしょうか?

4

1 に答える 1

1

コメントから、いくつかのクラスローダーがあるようです。注釈付きクラスとそのマニフェスト注釈は最初のクラスローダーによってifロードされ、質問のテストを含むクラスは2番目のクラスローダーによってロードされ、この2番目のクラスローダーを使用してマニフェストクラスをリロードします.

結果として、Manifest.classが と同じかどうかをテストしますが、そうclazz.getAnnotations()[0]ではありません。名前は同じですが、2 つの異なるクラス ローダーによってロードされるため、2 つの異なるクラスだからです。

アプリケーションが何を、どのように、どの環境で実行するかがわからないため、問題の修正方法を説明するのは困難です。ただし、1 つのクラスローダだけがクラスをロードできるようにする必要があります。

たとえば、Web アプリケーションで実行する場合、クラスはコンテナーのクラスパス、または Web アプリケーションのクラスパス (WEB-INF/classes および WEB-INF/lib/xxx.jar) に存在する必要がありますが、両方に存在することはできません。

于 2013-03-02T13:27:28.150 に答える