0

我不知道如何在不写几页的情况下解释这一点,所以我希望实际的代码更具表现力。

我制作了一个包含多个注释声明的 jar,类似于以下内容:

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

然后我制作了一个测试 jar,其中包含多个包中的多个类,并仅用上面的注释(带有 package-info.java)标记了一个包,如下所示:

@myPackage.MarkedPackage
package package.test.jar;

这个 jar 在其构建路径中有包含注释的 jar。

然后我创建了一个静态类,它有一个方法(LoadPlugins),它检索一个包含目录所有 jar 的列表。然后它在 jar 中搜索“package-info”类并检查该类包是否包含 MarkedPackage 注释。通过调用这个:

if (checkPackageAnnotation(thisClass.getPackage()))

其中 thisClass 是通过类加载器检索的包信息类。和:

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 项目中创建了 main,因此它具有完全相同的构建路径和资源。

Web 应用程序和“@Retention(RetentionPolicy.RUNTIME)”是否存在问题?

希望我足够清楚...希望有人为我提供解决方案...如果您需要更多信息-请告诉我。

谢谢你。

4

1 回答 1

0

是的,

因为一个包中只有一个包信息类。

于 2010-04-09T06:13:00.413 回答