假设我有一个注释
@Foo
,它指示一些其他类,如下所示:
@Foo({Other.class, Another.class})
public class MyClass { …
…
}
我正在为
Foo
编写一个注释处理器,在经历了所有 TypeMirror
魔法之后(请参阅 从 AnnotationProcessor 中的注释获取类值)我最终得到了一个包含AnnotationValue
表示其他类别。我可以得到这样的类名(用于说明的代码;未优化):List<? extends AnnotationValue>
太好了,现在我有两个字符串,
List<String> otherClassNames= ((List<? extends AnnotationValue>)value.getValue())
.stream()
.map(AnnotationValue::getValue)
.map(Object::toString)
.collect(toUnmodifiableList()))
和
com.example.Other
。我想看看 com.example.Another
和
Other
类是否用 Another
注释。下一步是什么?(请注意,类 @Bar
和
com.example.Other
可能位于其他库中,例如类路径上的 Maven 依赖项;com.example.Another
和 com.example.Other
的源文件不一定存在,并且这些类可能会存在它们本身不包含在该注释处理器的轮次中。但是我可以保证其他注释,com.example.Another
,将出现在类文件中。)我猜如果我能以某种方式将每个字符串转换为@Bar
,我就可以再次浏览整个类型镜像(或者如果我只想检查
TypeElement
我可以使用@Foo
)。但是,如何为发现的字符串(例如 typeElement.getAnnotation(Bar.class)
)获取 TypeElement
?我花了一整天的时间与注释、类和类型镜像搏斗,所以我要休息一下。明天答案对我来说可能就显而易见了。与此同时,也许有人已经知道一个简单的解决方案。否则,我会弄清楚,将其添加为答案,并帮助其他人。
中的提示,我需要为存储在com.example.Other
变量中的类名获取
TypeElement
的方法是:otherClassName
还有另一种选择:
TypeElement otherClassTypeElement = processingEnv.getElementUtils()
.getTypeElement(otherClassName);
与所有这些注解处理相关的方法一样,请仔细阅读 API 文档。在这种情况下,从技术上来说,可以发现多个这样的类。
然后,对于每个发现的类型元素(或选择适当的类型元素),您可以使用
Set<? extends TypeElement> otherClassTypeElements = processingEnv.getElementUtils()
.getAllTypeElements(otherClassName);
检查另一个类是否由
otherClassTypeElement.getAnnotation(Bar.class)
注释。请注意,如果 @Bar
又具有返回 @Bar
的方法,您可能需要使用 Class<>
枚举注释;有关如何/为什么的详细信息,请参阅我的问题中上面引用的文章。