有一个注释@MarkerAnnotation
。它可以直接添加到方法中。或任何其他注释,如
@MarkerAnnotation
@Interface CustomAnnotation {...}
并且此@CustomAnnotation
也可以直接添加到方法中。这是许多框架允许用户添加自己的注释(例如spring)的标准方式。
现在,给定一个类,我想找到所有用@MarkerAnnotation
直接或间接标记的方法。对于每种方法,我还想查找关联的@MarkerAnnotation
和/或@CustomAnnotation
。有没有我可以使用的工具,或者我必须手动完成它?
答案 0 :(得分:0)
对于通用方法,您应该使用javac
的注释处理器工具,该工具要求您编写注释处理器,该处理器使用包javax.annotation.processing
和javax.lang.model
及其中的API。子包。此代码将在javac
内运行。 (有一个较旧的工具apt
,它与javac
分开,但在Java 7中不推荐使用apt
。)
特别是,当您访问每个Element
时,您可以在其上调用getAnnotationMirrors
。然后,对于每个注释,请调用getAnnotationType().asElement()
以获取注释类型的Element
。如果可能存在多个间接级别,则可能需要使用递归来查找间接注释。
答案 1 :(得分:0)
例如像这样...
public class Test{
@MarkerAnnotation
public void TestMethod1(){
}
@CustomAnnotation
@MarkerAnnotation
public void TestMethod2(){
}
}
你可以像这样解析..
public class AnnotationTest{
public static void main(String[] args){
Method[] methods = Test.class.getDeclaredMethods();
for(Method method: methods){
Annotation[] annotations = method.getAnnotations();
for(Annotation annotation: annotations){
if(annotation instanceof MarkerAnnotation)
System.out.println(method.getName() +" annotated with MarkerAnnotation");
if(annotation instanceof CustomAnnotation)
System.out.println(method.getName() +" annotated with CustomAnnotation");
}
}
}
}
如果你想检查CustomAnnotation有MarkerAnnotation,那么就这样做..
if(CustomAnnotation.class.isAnnotation()){
Annotation[] annotations = CustomAnnotation.class.getAnnotations();
if(annotations[0] instanceof MarkerAnnotation){
System.out.println("CustomAnnotation have MarkerAnnotation");
}
}