Есть 2 аннотации:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Ann {
public String description() default "AAA";
public String template() default "BBB";
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface AnotherAnn {
public String text() default "Text";
}
Есть простой класс в котором метод обозначен одной из вышеуказанных аннотаций:
public class App {
@Ann(description = "Yo!", template = "Bitches.")
public void someMethod(){}
}
Необходимо при помощи процессора аннотаций заменить в методе someMethod класса App аннотацию @Ann на аннотацию @AnotherAnn (или дописать вторую). И как результат - отобразить содержимое параметра text из аннотации @AnotherAnn:
@SupportedAnnotationTypes("alexiuscrow.annotation.Ann")
@SupportedSourceVersion(SourceVersion.RELEASE_6)
public class Proc extends AbstractProcessor {
public Proc() {
super();
}
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
/* TODO DIRTY WORK (ANNOTATION REPLACEMENT)*/
Class<App> appClass = App.class;
for (Method method: appClass.getDeclaredMethods()) {
if (method.isAnnotationPresent(AnotherAnn.class)) {
AnotherAnn anotherAnn = method.getAnnotation(AnotherAnn.class);
System.out.println("Method: \t" + method.getName());
System.out.println("AnotherAnn: \t" + anotherAnn);
System.out.println("Text: \t" + anotherAnn.text());
}
}
return true;
}
}