我正在尝试Java (javax)批注处理。
假设我有一个方法注释:
@Target(ElementType.METHOD)
public @interface MethodAnnotation { }
现在,我想要处理从带注释的方法覆盖的类型中的所有方法:
interface MyInterface() {
@MethodAnnotation
void f()
}
class MyClass implements MyInterface {
override void f() { } // <- I want to process this method
}
@Inherited
元注释似乎不适合这里:
请注意,如果带注释的类型用于注释除类以外的任何内容,则此元注释类型不起作用。
另外,有没有可能处理继承的类方法,而不是在子类中被覆盖?如下所示:
class MyClass {
@MethodAnnotation
void f() { }
}
class MySubClass extends MyClass { } // <- I want to process its f()
// or at least to find out that it doesn't
// override the method
如何在AbstractProcessor
中访问某个方法的重写方法
我想,为了实现这一点,我需要找到eclosing类的子类,但我也没有找到这样做的方法。
UPD:我认为使用RoundEnvironment.getRootElements()
是可能的,但仍然没有找到合适的方法。
发布于 2016-09-06 00:31:53
简而言之,开箱即用的批注处理不会让您轻松做到这一点,但它是可以做到的。
实际上,您将不得不处理每个方法并自己进行过滤,而不是使用普通的分派机制进行处理。
步骤1:
定义您的处理器,使其通过使用"*"
作为其支持的注释类型来执行supports all annotations。这意味着你的处理器每轮都会被调用。
第2步:
使用getRootElements
来获取每轮的整个元素集。
第3步:
创建一个ElementScanner8
来遍历您找到的任何元素来查找ExecutableElement
,如果您愿意相信被覆盖的方法是用@Override
注释的,那么您可以对这些方法进行快速过滤。否则,只需查看所有这些内容。
第4步:
现在,您需要查看该方法是否用您要查找的注释覆盖了某个方法。没有简单的方法来获取给定方法被覆盖的方法,所以您需要获取方法的enclosing element,(递归地)查看它的superclass和implemented interfaces,通过所讨论的方法获取它们的enclosed elements、filter out the methods和test to see if it has been overridden。如果有,你可以检查annotations,看看它是否有你关心的。
第5步:
此时,您应该拥有您正在寻找的覆盖方法、覆盖方法和注释镜像,因此您应该能够实现您想要的任何逻辑。
发布于 2016-08-30 03:19:44
如果这些注释在运行时可用,并且您希望在运行时访问它们,则可以使用Reflections库。
例如:
Collection<URL> urls = ClasspathHelper.forPackage("nl.shopname.location.domain");
Reflections reflections = new Reflections(
new ConfigurationBuilder().setUrls(urls).setScanners(new FieldAnnotationsScanner()));
Set<Field> fieldsWithAnnotation = reflections.getFieldsAnnotatedWith(MyAnnotation.class);
发布于 2016-08-30 17:59:53
根据Jsr269-1.8中javax.annotation.processing.Processor
的javadoc
如果一个注解满足AnnotatedConstruct中给出的存在定义,那么它就是存在的
。简而言之,为了发现的目的,注释被认为是存在的,如果它是直接存在的或通过继承存在的。注释由于被容器注释包装而不被认为是存在的...
AnnotatedConstruct#getAnnotationsByType的JavaDoc表示它返回间接呈现的注释,所以我认为您应该扫描方法,并使用此调用检查它们是否间接具有注释。一些符合this精神的东西。
免责声明...没有尝试过;)
https://stackoverflow.com/questions/38292131
复制相似问题