У меня есть аннотация @MyAnnotation
, и я могу комментировать любой тип (класс) с ним.Затем у меня есть класс с именем AnnotatedClassRegister
, и я хотел бы, чтобы он регистрировал все классы, отмеченные @MyAnnotation
, чтобы я мог получить к ним доступ позже.И я хотел бы зарегистрировать эти классы автоматически при создании AnnotatedClassRegister
, если это возможно, и, что наиболее важно, до создания экземпляров аннотированных классов.
В моем распоряжении AspectJ и Guice.Единственное решение, которое я до сих пор придумал, - это использовать Guice для внедрения одноэлементного экземпляра AnnotatedClassRegister
в аспект, который ищет все классы, помеченные @MyAnnotation
, и добавляет код, необходимый для регистрации такого класса в своем конструкторе.,Недостатком этого решения является то, что мне нужно создавать экземпляры каждого аннотированного класса, чтобы код, добавленный AOP, действительно выполнялся, поэтому я не могу использовать ленивое создание экземпляров этих классов.
Пример упрощенного псевдокода моегоРешение:
// 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())
}
}
Какой подход я должен использовать для решения этой проблемы?Есть ли простой способ получить все такие аннотированные классы в classpath с помощью рефлексии, чтобы мне вообще не нужно было использовать AOP?Или любое другое решение?
Любые идеи высоко ценятся, спасибо!