Я использовал несколько руководств по обработке аннотаций (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 во время выполнения?
Или я использую неправильные рамки, чтобы получить то, что я хочу?
«В качестве альтернативы - во время сборки вы можете построить класс со списком классов». - Вы имеете в виду вывод в файл, который читается приложением во время выполнения? – corgrath
Да, используйте 'processingEnv.getFiler(). CreateSourceFile (qualifiedName) .openWriter()' и запишите содержимое патчей в статическую переменную класса 'qualifedName'. Конечно, вы должны написать все необходимые классы шаблонов 'public class simpleName {private static final Map < > patches = new Map < > {содержимое патчей} ... – emory
Wow, createSourceFile отлично. Я не знал, что это возможно. Спасибо :-) – corgrath