Java 注释处理器 getEnclosingElement() 方法

Java Annotation Processor getEnclosingElement() method

你好,请问Element界面中getEnclosingElement()方法的注释是什么意思,不太明白。 javadoc如下:

Returns the innermost element within which this element is, loosely speaking, enclosed.

  • If this element is one whose declaration is lexically enclosed immediately within the declaration of another element, that other element is returned.

  • If this is a top-level type, its package is returned.

  • If this is a package, null is returned.

  • If this is a type parameter, the generic element of the type parameter is returned.

  • If this is a method or constructor parameter, the executable element which declares the parameter is returned.

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

一个Element可以表示,截至Java 13:

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

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

模块-info.java:

@Foobar
module example {
  exports com.example;
}

包-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 注释。
  • class Foo,即 TypeElement,有一个 @Baz 注释。
  • 类型参数 T,即 TypeParameterElement,具有 @Qux 注释。
  • bar 字段 VariableElement 没有注释。
  • 构造函数 #Foo(T) 是一个 ExecutableElement,没有注释。
  • 构造函数的参数 bar,即 VariableElement,没有注释。
  • 方法 #toString() 是一个 ExectuableElement,有一个 @Override 注释。

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

方法Element#getEnclosingElement() returns,不出所料,包含当前ElementElement,如果有的话。因此,如果您要在代表方法 #toString()ExecutableElement 上调用该方法,那么您将获得代表 class FooTypeElement