Java-аннотации - проблема с вызовом класса локатора из проекта Vaadin - PullRequest
0 голосов
/ 08 апреля 2010

Я не уверен, как объяснить это, не написав несколько страниц, поэтому я надеюсь, что реальный код более выразителен.

Я сделал банку с несколькими объявлениями аннотаций, похожими на следующие:

@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)"?

надеюсь, что я достаточно ясно ... Надеюсь, у кого-то есть решение для меня ... Если вам нужна дополнительная информация - дайте мне знать.

Спасибо.

1 Ответ

0 голосов
/ 09 апреля 2010

да,

потому что в одном пакете есть только один класс информации о пакете.

...