Я не уверен, как объяснить это, не написав несколько страниц, поэтому я надеюсь, что реальный код более выразителен.
Я сделал банку с несколькими объявлениями аннотаций, похожими на следующие:
@Target(ElementType.PACKAGE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MarkedPackage {
}
затем я сделал тестовый jar, содержащий несколько классов в нескольких пакетах, и пометил только один пакет с вышеуказанной аннотацией (с package-info.java), как показано ниже:
@myPackage.MarkedPackage
package package.test.jar;
у этого фляги на пути сборки была фляга, содержащая аннотации.
затем я создал статический класс, у которого есть метод (LoadPlugins), который извлекает список со всеми банками каталога. Затем он ищет в 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 (). Длина для целей отладки.
И проблема возникает, когда я вызываю метод из статического класса:
если я вызываю его из основной функции:
public class MyMain {
public static void main(String[] args){
PluginUtils.LoadPlugins();
}
}
все работает отлично, он отображает '1' из этого System.out.println (elem.getAnnotations (). Length);
Но если я позвоню с кнопки из моего проекта Vaadin:
header.addComponent(new Button("CallThat",
new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
PluginUtils.LoadPlugins();
}
}));
Отображает '0' из этого System.out.println (elem.getAnnotations (). Length);
Также я должен упомянуть, что я создал main внутри своего проекта Vaadin, чтобы он имел точно такой же путь сборки и ресурсы.
Есть ли проблема с веб-приложениями и этим "@Retention (RetentionPolicy.RUNTIME)"?
надеюсь, что я достаточно ясно ... Надеюсь, у кого-то есть решение для меня ... Если вам нужна дополнительная информация - дайте мне знать.
Спасибо.