Сканер аннотаций в пакетах - PullRequest
4 голосов
/ 12 августа 2011

Я ищу простой способ просмотреть пакет java для моей собственной аннотации.

Что я пытаюсь сделать, так это пометить некоторые классы своей собственной аннотацией. Каждую минуту сканер должен сканировать некоторые пакеты для этой аннотации.

С помощью скотационного баночка я попробовал это

URL url = ClasspathUrlFinder.findClassBase(FileWatcher.class);

и с помощью AnnotationDB я могу проверить, есть ли у этого класса (FileWatcher.class) аннотация. Теперь мне нужен список классов, чтобы просмотреть их все.

Я прочитал несколько статей, и большинство людей сказали, что это невозможно, поскольку загрузчик классов также может загружать внешние файлы jar.

Другой вариант, который у меня есть, - это скопировать все проекты EJB, содержащие эти аннотации, в подкаталог и отсканировать все эти файлы JAR. Я думаю, что это может сработать, но нет ли лучшего способа?

Много поздравлений, Hauke ​​

Ответы [ 3 ]

3 голосов
/ 12 августа 2011

Попробуйте использовать отражения . В тестовом коде есть примеров .

1 голос
/ 13 августа 2011

Спасибо. Это очень помогло и работает очень легко. Если кому-то это нужно:

      String packagename = "de.whatever";

      final Reflections reflections = new Reflections(packagename);

      Set<Class<? extends CargoServiceListenerInterface>> subTypes = reflections.getSubTypesOf(CargoServiceListenerInterface.class);

      for (Class<? extends CargoServiceListenerInterface> class1 : subTypes) {
        System.out.println("Class : " + class1.getName());
      }

Вместо getSubtypes вы также можете вызвать метод аннотации.

Если вы используете maven, укажите это в pom.xml

    <repositories>
    <repository>
        <id>reflections-repo</id>
        <name>Reflections Maven2 Repository</name>
        <url>http://reflections.googlecode.com/svn/repo</url>
    </repository>
</repositories>

    <dependency>
    <groupId>org.reflections</groupId>
    <artifactId>reflections</artifactId>
    <version>0.9.5</version>
</dependency>
0 голосов
/ 21 ноября 2011

Если вы хотите действительно легкий вес (без зависимостей, простой API, файл jar 15 КБ) и очень быстрое решение, взгляните на детектор аннотаций, найденный в https://github.com/rmuller/infomas-asl. Сканирование определенных пакетов выполняется очень быстро (за несколько мс).

См. Также вопрос Сканирование аннотаций Java во время выполнения для других опций

Отказ от ответственности: я автор.

...