Java - Зарегистрируйте все классы, аннотированные с помощью @MyAnnotation

У меня есть аннотация @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())
    }
}

Какой подход я должен использовать для решения этой проблемы? Есть ли простой способ получить все такие аннотированные классы в пути к классам через отражение, чтобы я не Не нужно ли вообще использовать АОП? Или любое другое решение?

Любые идеи приветствуются, спасибо!

6
задан janhink 4 May 2011 в 21:18
поделиться