2012-04-20 5 views
3

Я использовал несколько руководств по обработке аннотаций (APT) (например, 1 и 2) в Интернете, и им удалось заставить его работать в процессе компиляции/сборки и даже заставить его работать в Eclipse.Как использовать API обработки аннотаций во время выполнения?

Есть ли способ, которым я могу использовать APT во время выполнения, чтобы получить список типов (классов), используя мою аннотацию.

я написал что-то вроде:

@SupportedAnnotationTypes("com.domain.MyAnnotation") 
public class MyAbstractProcessor extends AbstractProcessor { 

    public static Map<Element, MyAnnotation> patches = new HashMap<Element, MyAnnotation>(); 

    @Override 
    public boolean process(final Set<? extends TypeElement> annotations, final RoundEnvironment roundEnvironment) { 

     // Get all classes that has the annotation 
     Set<? extends Element> classElements = roundEnvironment.getElementsAnnotatedWith(MyAnnotation.class); 

     // For each class that has the annotation 
     for (final Element classElement : classElements) { 

      patches.put(classElement, annotation); 

Так MyAbstractProcessor.patches бы заполнить список классов, использующих аннотацию. Благородная идея, помимо недостатка, который этот APT выполняет во время сборки, и не запускает время.

Возможно ли использовать APT во время выполнения?

Или я использую неправильные рамки, чтобы получить то, что я хочу?

ответ

4

Вы можете получить доступ к аннотации во время выполнения с использованием отражения - getAnnotations.

Чтобы получить список классов (в вашем пути к классам) с помощью аннотации, вы можете - во время выполнения - повторить все тесты классов, если у них есть эта аннотация.

Альтернативно - во время сборки вы можете построить класс со списком классов.

+0

«В качестве альтернативы - во время сборки вы можете построить класс со списком классов». - Вы имеете в виду вывод в файл, который читается приложением во время выполнения? – corgrath

+0

Да, используйте 'processingEnv.getFiler(). CreateSourceFile (qualifiedName) .openWriter()' и запишите содержимое патчей в статическую переменную класса 'qualifedName'. Конечно, вы должны написать все необходимые классы шаблонов 'public class simpleName {private static final Map < > patches = new Map < > {содержимое патчей} ... – emory

+0

Wow, createSourceFile отлично. Я не знал, что это возможно. Спасибо :-) – corgrath

1

Вы указали, что ваша аннотация доступна во время выполнения с использованием RetentionPolicy? Если нет, вам нужно использовать аннотацию @Retention на вашем.

@Retention(RetentionPolicy.RUNTIME) 

public @interface MyAnnotation { 
    String[] parameters(); 
    String[] exceptions(); 
} 
+0

Да, я сделал. И SOURCE и RUNTIME :-) – corgrath

+0

Обычно он должен работать с этой политикой хранения. Если он не работает с APT, вы можете попробовать JSR 269 (Pluggable Annotations Processing). – zeropouet

Смежные вопросы