我正在尝试处理注释,我的处理器类扩展AbstractProcessor
,process
方法如下:
KeyAnnotationProcessor.java
@Override
public boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) {
// Instanciation du Visitor
final KeyVisitor visitor = new KeyVisitor(processingEnv);
// On boucle sur toutes les Annotations :
for (final TypeElement declaration : annotations) {
// On "visite" chacune des déclarations trouvées :
declaration.accept(visitor,roundEnv);
}
}
正如所提供的代码所示,我正在为每个注释使用访问者,访问者的代码:
KeyVisitor.java
public class KeyVisitor extends SimpleElementVisitor6<Void, RoundEnvironment> {
final ProcessingEnvironment env;
public KeyVisitor(final ProcessingEnvironment env) {
this.env = env;
}
@Override
public Void visitType(TypeElement e, RoundEnvironment p) {
Key cle=e.getAnnotation(Key.class);
if(cle!=null){
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE , "OK");
}else{
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR , "ERROR");
}
}
这是我的Key class
Key.java
@Documented
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.TYPE)
public @interface Key {
String description();
String filename();
}
这是我尝试处理的例子,它是一个java文件:
OracleDirectory.java
@Key(description = "Oracle Directory configuration", filename = "oracle-directory")
public enum OracleDirectoryProperties {
}
问题是cle
visitType
Keyvisitor
中的getAnnotation
始终为空,为什么[-0.2122,-0.1213)
[-0.2750,-0.2122)
[-0.1213,-0.0222)
[-0.1213,-0.0222)
方法始终返回null?任何帮助都会被贬低。
答案 0 :(得分:1)
很确定这是你的问题:
@Retention(RetentionPolicy.SOURCE)
将其更改为
@Retention(RetentionPolicy.CLASS)
SOURCE保留策略告诉Java,“这个注释只需要出现在源代码中” - 因此当javac
解析代码时,它会抛出该注释。您希望它在注释处理器中可用,因此需要告诉javac
保留类本身的信息。
答案 1 :(得分:0)
传递给X
的集合表示要求处理器处理的注释的类型。在您的情况下,它将包含process
的{{1}}。由于TypeElement
没有用@interface Key
注释,因此在其上调用Key
将返回@Key
。
要获取以标注 getAnnotation(Key.class)
的元素,您需要调用null
。这将返回一个包含@Key
的{{1}}的集合,然后您的访问者将按您期望的方式对其进行处理,并检索其上的roundEnv.getElementsAnnotatedWith(Key.class)
批注。