Как я могу найти все классы на пути к классам, которые имеют конкретную аннотацию метода? - PullRequest
10 голосов
/ 18 марта 2009

Я хочу реализовать механизм инициализации, основанный на аннотациях в Java. В частности, у меня есть аннотация, которую я определил:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Initialization {

/**
 * If the eager initialization flag is set to <code>true</code> then the
 * initialized class will be initialized the first time it is created.
 * Otherwise, it will be initialized the first time it is used.
 * 
 * @return <code>true</code> if the initialization method should be called
 *         eagerly
 */
boolean eager() default false;

}

Дополнительно у меня есть интерфейс:

public interface SomeKindOfBasicInterface {}

Я хочу найти каждую реализацию класса SomeKindOfBasicInterface на моем пути к классам, в которой есть пометка @Initialization для метода. Я смотрю на MetaDataReader инструменты Spring, которые выглядят как лучший способ отложить загрузку других реализаций SomeKindOfBasicInterface, пока я делаю это ... но я не уверен, как выполнить поиск, как я описания. Любые советы?

Ответы [ 3 ]

10 голосов
/ 23 марта 2009

Вы можете использовать Reflections , который является инструментом анализа метаданных среды выполнения Java. Я использовал его, чтобы получить все подтипы данного типа, но он также может обработать ваш случай.

1 голос
/ 18 марта 2009

Вы можете использовать javassist , чтобы найти аннотации в ваших классах, даже перед их загрузкой, но вам необходимо непосредственно прочитать файлы .class, что может означать открытие JAR-файла самостоятельно и т. Д. Также вам нужно знать, где искать занятия. Вы не можете просто запросить время выполнения для всех подклассов вашего BasicInterface.

1 голос
/ 18 марта 2009

Я бы в основном создал реализацию BeanPostProcessor , возможно, на основе CommonAnnotationBeanPostProcessor . Затем я настроил бы component-scan , который сканирует путь к классу и выбирает все bean-компоненты, соответствующие вашей спецификации. Когда компонент инициализируется, ваш постпроцессор будет запущен.

Вижу, я предполагаю, что вы ищете бобы. Если это не так, возможно, вам придется самостоятельно сканировать путь к классам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...