0

何ページも書かずにこれを説明する方法がわからないので、実際のコードがより表現力豊かであることを願っています。

次のような複数の注釈宣言を含む jar を作成しました。

@Target(ElementType.PACKAGE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MarkedPackage {
}

次に、いくつかのパッケージにいくつかのクラスを含むテスト jar を作成し、以下のように上記の注釈 (package-info.java を使用) で 1 つのパッケージだけをマークしました。

@myPackage.MarkedPackage
package package.test.jar;

この jar のビルド パスには、注釈を含む jar がありました。

次に、ディレクトリのすべての jar を含むリストを取得するメソッド (LoadPlugins) を持つ静的クラスを作成しました。次に、「package-info」クラスの jar ファイルを検索し、そのクラス パッケージに MarkedPackage アノテーションが含まれているかどうかを確認します。これを呼び出すことによって:

if (checkPackageAnnotation(thisClass.getPackage()))

ここで、thisClass は、クラスローダーを介して取得された package-info クラスです。と:

public static boolean checkPackageAnnotation(AnnotatedElement elem) {
  System.out.println(elem.getAnnotations().length);
  if (elem == null || !elem.isAnnotationPresent(MarkedPackage.class))
   return false;
return true;
}

elem.getAnnotatios().length はデバッグ目的で使用されます。

そして、静的クラスからメソッドを呼び出すと問題が発生します。

メイン関数から呼び出す場合:

public class MyMain {
 public static void main(String[] args){
  PluginUtils.LoadPlugins();
 }
}

すべてが完全に機能し、その System.out.println(elem.getAnnotations().length); から「1」が表示されます。

しかし、Vaadin プロジェクトのボタンから呼び出すと、次のようになります。

header.addComponent(new Button("CallThat",
 new Button.ClickListener() {
 public void buttonClick(ClickEvent event) {
 PluginUtils.LoadPlugins();
 }
}));

その System.out.println(elem.getAnnotations().length); から「0」が表示されます。

また、まったく同じビルド パスとリソースを持つように、Vaadin プロジェクト内にメインを作成したことにも言及する必要があります。

Web アプリケーションとその "@Retention(RetentionPolicy.RUNTIME)" に問題はありますか?

私が十分に明確であることを願っています...誰かが私に解決策を持っていることを願っています...さらに情報が必要な場合は、お知らせください。

ありがとうございました。

4

1 に答える 1

0

はい、

1 つのパッケージには package-info クラスが 1 つしかないためです。

于 2010-04-09T06:13:00.413 に答える