繁体   English   中英

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

[英]How can I refer to implementations of a method in annotation processing?

我正在玩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访问某个方法的overriden方法?

我想,要实现这一点,我需要找到eclosing类的子类,但我还没有找到一种方法来做到这一点。

UPD :我想可以使用RoundEnvironment.getRootElements()但仍然没有找到正确的方法。

简短的回答是开箱即用的注释处理不会让你这么容易,但它可以做到。

您实际上不必使用正常的调度机制进行处理,而是必须自己处理每个方法并进行过滤。

步骤1:

通过使用"*"作为其支持的注释类型来定义处理器,使其支持所有注释 这意味着您的处理器将每轮调用。

第2步:

使用getRootElements获取整个元素集。

第3步:

创建一个ElementScanner8来遍历您找到的任何查找ExecutableElement的元素。 如果您愿意相信已使用@Override注释了重写方法,则可以对这些方法进行快速过滤。 否则,只要看看所有这些。

第4步:

现在,您需要查看该方法是否使用您正在查找的注释覆盖方法。 获取给定方法已被覆盖的方法没有简单的方法,因此您需要获取方法的封闭元素 ,查看其超类实现接口 (递归),获取其封闭元素过滤掉方法 ,并测试到看看它是否被相关方法覆盖了。 如果有,您可以检查注释 ,看它是否有您关心的注释

第5步:

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

如果这些注释在运行时可用,并且您希望在运行时访问它们,则可以使用“ 反射”库。

例如:

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); 

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

如果注释符合AnnotatedConstruct中给出的存在定义,则存在注释。 简而言之,如果注释通过继承直接存在或存在,则认为存在用于发现的目的。 由于被容器注释包装,注释不被视为存在...

AnnotatedConstruct的JavaDoc #getAnnotationsByType表示它间接返回当前注释,因此我认为您应该扫描方法并检查它们是否使用此调用间接地具有注释。 东西在精神

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

方法注释不是继承的。 可以通过使用“@Inherited”注释继承类型注释。

你可以做的是定义一个带有继承类型注释的功能接口,但是我不知道这对你来说是否足够优雅。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM