我不知道如何在不写几页的情况下解释这一点,所以我希望实际的代码更具表现力。
我制作了一个包含多个注释声明的 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)”是否存在问题?
希望我足够清楚...希望有人为我提供解决方案...如果您需要更多信息-请告诉我。
谢谢你。