问题:
- 通过注解处理器是否可以访问带有
@Target(ElementType.TYPE_USE)
注解的元素? - 通过注解处理器是否可以访问带注解的类型限定边界?
如果有相关文档链接,欢迎提供。
背景信息:
注解:
@Target(ElementType.TYPE_USE)
@Retention(RetentionPolicy.SOURCE)
public @interface TypeUseAnno {}
一个示例类:
public class SomeClass extends HashMap<@TypeUseAnno String, String> {}
处理器:@SupportedSourceVersion(SourceVersion.RELEASE_8)
@SupportedAnnotationTypes("base.annotations.TypeUseAnno")
public class Processor extends AbstractProcessor {
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
this.processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING, "Initialized.");
}
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
this.processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING, "Invoked.");
for (TypeElement annotation : annotations) {
this.processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING, "" + roundEnv.getElementsAnnotatedWith(annotation));
}
return true;
}
}
在类路径上使用Processor
编译上述的SomeClass
将显示"Intialized"
消息,但是process(...)
方法从未被调用。
通过为处理器添加另一个注释@Target(ElementType.PARAMETER)
,当注释存在于方法参数上时正常工作。如果方法参数带有@TypeUseAnno
注释,则处理过程将再次忽略该元素。
javax.lang.model
(公共) API可以直接使用。另一方面,在Java 9中内部的com.sun.source
API根本不可用。后者肯定更灵活,但如果您计划迁移到Java 9或更高版本,则最好使用公共API。 - Ondřej FischerTypeMirror
(因为它被注释了类型)来访问它们,因此你不能像普通注解那样进行全局搜索和声明。但是,你可以通过TypeMirror.getAnnotationMirrors()
检查变量、字段等是否有TYPE_USE注解。 - Adam Gent