У меня есть аннотация @MyAnnotation
, и я могу аннотировать с ее помощью любой тип (класс). Затем у меня есть класс под названием AnnotatedClassRegister
, и я хотел бы, чтобы он зарегистрировал все классы, аннотированные @MyAnnotation
, чтобы я мог получить к ним доступ позже. И я бы хотел, чтобы эти классы автоматически регистрировались при создании AnnotatedClassRegister
, если это возможно, и, что наиболее важно, до создания экземпляров аннотированных классов.
В моем распоряжении есть AspectJ и Guice. Единственное решение, которое я придумал до сих пор, - это использовать Guice для внедрения одноэлементного экземпляра AnnotatedClassRegister
в аспект, который ищет все классы, помеченные @MyAnnotation
, и добавляет код, необходимый для регистрации такого класса в его конструкторе. Обратной стороной этого решения является то, что мне нужно создать экземпляр каждого аннотированного класса, чтобы код, добавленный АОП, действительно запускался, поэтому я не могу использовать ленивое создание экземпляров этих классов.
Упрощенный пример псевдокода моего решения:
// This is the class where annotated types are registered
public class AnnotatedClassRegister {
public void registerClass(Class<?> clz) {
...
}
}
// This is the aspect which adds registration code to constructors of annotated
// classes
public aspect AutomaticRegistrationAspect {
@Inject
AnnotatedClassRegister register;
pointcutWhichPicksConstructorsOfAnnotatedClasses(Object annotatedType) :
execution(/* Pointcut definition */) && args(this)
after(Object annotatedType) :
pointcutWhichPicksConstructorsOfAnnotatedClasses(annotatedType) {
// registering the class of object whose constructor was picked
// by the pointcut
register.registerClass(annotatedType.getClass())
}
}
Какой подход я должен использовать для решения этой проблемы? Есть ли простой способ получить все такие аннотированные классы в пути к классам через отражение, чтобы я не Не нужно ли вообще использовать АОП? Или любое другое решение?
Любые идеи приветствуются, спасибо!