首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在批注处理中引用方法的实现?

如何在批注处理中引用方法的实现?
EN

Stack Overflow用户
提问于 2016-07-10 20:58:51
回答 4查看 1.3K关注 0票数 21

我正在尝试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()是可能的,但仍然没有找到合适的方法。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-09-06 00:31:53

简而言之,开箱即用的批注处理不会让您轻松做到这一点,但它是可以做到的。

实际上,您将不得不处理每个方法并自己进行过滤,而不是使用普通的分派机制进行处理。

步骤1:

定义您的处理器,使其通过使用"*"作为其支持的注释类型来执行supports all annotations。这意味着你的处理器每轮都会被调用。

第2步:

使用getRootElements来获取每轮的整个元素集。

第3步:

创建一个ElementScanner8来遍历您找到的任何元素来查找ExecutableElement,如果您愿意相信被覆盖的方法是用@Override注释的,那么您可以对这些方法进行快速过滤。否则,只需查看所有这些内容。

第4步:

现在,您需要查看该方法是否用您要查找的注释覆盖了某个方法。没有简单的方法来获取给定方法被覆盖的方法,所以您需要获取方法的enclosing element,(递归地)查看它的superclassimplemented interfaces,通过所讨论的方法获取它们的enclosed elementsfilter out the methodstest to see if it has been overridden。如果有,你可以检查annotations,看看它是否有你关心的。

第5步:

此时,您应该拥有您正在寻找的覆盖方法、覆盖方法和注释镜像,因此您应该能够实现您想要的任何逻辑。

票数 10
EN

Stack Overflow用户

发布于 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); 
票数 2
EN

Stack Overflow用户

发布于 2016-08-30 17:59:53

根据Jsr269-1.8中javax.annotation.processing.Processor的javadoc

如果一个注解满足AnnotatedConstruct中给出的存在定义,那么它就是存在的

。简而言之,为了发现的目的,注释被认为是存在的,如果它是直接存在的或通过继承存在的。注释由于被容器注释包装而不被认为是存在的...

AnnotatedConstruct#getAnnotationsByType的JavaDoc表示它返回间接呈现的注释,所以我认为您应该扫描方法,并使用此调用检查它们是否间接具有注释。一些符合this精神的东西。

免责声明...没有尝试过;)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38292131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档