【问题标题】:Java Annotation Processor getEnclosingElement() methodJava 注释处理器 getEnclosureElement() 方法
【发布时间】:2020-03-07 07:47:50
【问题描述】:
你好,想问一下Element接口中getEnclosingElement()方法的cmets是什么意思,不太明白。 javadoc如下:
返回最里面的元素,松散地说,该元素包含在其中。
注解可以用在类、变量(全局或局部)、方法等上,但不知道注解与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 上调用该方法,那么您将获得表示类Foo 的TypeElement。