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

Я хочу реализовать механизм инициализации, основанный на аннотациях на 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 для метода. Я смотрю на Spring MetaDataReader инструменты, которые выглядят как лучший способ отложить загрузку других реализаций SomeKindOfBasicInterface, пока я это делаю... но я не уверен, как сделать поиск, как я описывая. Любые советы?

Ответ 1

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

Ответ 2

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

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

Ответ 3

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