【问题标题】:Java Annotation Processor getEnclosingElement() methodJava 注释处理器 getEnclosureElement() 方法
【发布时间】:2020-03-07 07:47:50
【问题描述】:

你好,想问一下Element接口中getEnclosingElement()方法的cmets是什么意思,不太明白。 javadoc如下:

返回最里面的元素,松散地说,该元素包含在其中。

  • 如果该元素的声明被直接包含在另一个元素的声明中,则返回另一个元素。

  • 如果这是顶级类型,则返回其包。

  • 如果这是一个,则返回 null。

  • 如果这是一个类型参数,则返回类型参数的通用元素。

  • 如果这是一个方法或构造函数参数,则返回声明参数的可执行元素。

注解可以用在类、变量(全局或局部)、方法等上,但不知道注解与Element子类的对应关系。谢谢!!!

【问题讨论】:

    标签: java annotations java-annotations


    【解决方案1】:

    从 Java 13 开始,Element 可以表示:

    • 模块声明 - ModuleElement
    • 包声明 - PackageElement
    • 接口、类、枚举或注释类型 - TypeElement
    • 构造函数、方法或初始化程序 - ExecutableElement
    • 字段、枚举常量、方法或构造函数参数、局部变量、资源变量或异常参数 - VariableElement
    • 类型参数 - TypeParameterElement

    这些元素中的每一个都可以存在注释。例如:

    模块信息.java

    @Foobar
    module example {
      exports com.example;
    }
    

    package-info.java

    @Foobaz
    package com.example;
    

    Foo.java:

    package com.example;
    
    @Baz
    public class Foo<@Qux T> {
    
      private final T bar;
    
      public Foo(T bar) {
        this.bar = bar;
      }
    
      @Override
      public String toString() {
        return "Foo{bar= " + bar + "}";
      }
    }
    
    • 模块example,即ModuleElement,存在@Foobar 注释。
    • com.example,即PackageElement,有一个@Foobaz 注释。
    • Foo,即TypeElement,存在@Baz 注释。
    • 类型参数T,即TypeParameterElement,存在@Qux 注释。
    • 字段bar(原为VariableElement)没有注释。
    • 构造函数#Foo(T)(应该是ExecutableElement)没有注释。
    • 构造函数的参数bar(应该是VariableElement)没有注释。
    • #toString() 方法(将是 ExectuableElement)存在 @Override 注释。

    您可以通过AnnotatedConstruct 接口的方法获取这些元素上存在的注释,Element 扩展了该接口。

    Element#getEnclosingElement() 方法毫无疑问地返回包含当前Element(如果有)的Element。因此,如果您要在表示方法#toString()ExecutableElement 上调用该方法,那么您将获得表示类FooTypeElement

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多