Java注释处理器通过类名检查发现类型的注释

问题描述 投票:0回答:1

假设我有一个注释

@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
我花了一整天的时间与注释、类和类型镜像搏斗,所以我要休息一下。明天答案对我来说可能就显而易见了。与此同时,也许有人已经知道一个简单的解决方案。否则,我会弄清楚,将其添加为答案,并帮助其他人。

java annotation-processing
1个回答
0
投票
另一个答案

中的提示,我需要为存储在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<>
枚举注释;有关如何/为什么的详细信息,请参阅我的问题中上面引用的文章。
    

© www.soinside.com 2019 - 2024. All rights reserved.