理解java中的’TypeElement’和’DeclaredType’接口
这两个接口的一个用途,就是编写注释处理器。
作为一个java初学者,我找到了这两个包添加的间接层: javax.lang.model.element
和javax.lang.model.type
以提供有关java interface
和java class
混淆的元数据。
………
java doc评论说,
TypeElement
表示class
或interface
程序元素。 提供对类型及其成员的信息的访问。 请注意,enum
类型是一种类,注释类型是一种interface
。
DeclaredType
表示声明的类型,类型类型或interface
类型。 这包括参数化类型,例如java.util.Set
以及原始类型。
两者的区别:
TypeElement
表示class
或interface
元素 ,而DeclaredType
表示class
或interface
类型 ,后者是前者的使用(或调用 )。
如何区分行话元素与类型 ? 例如: class
元素与class
类型有何不同? 请帮我举个例子。
元素是用于组成软件的部分,即ExecutableElement
,顾名思义,它包含可执行代码, VariableElement
描述了一种存储和TypeElement
,它们将这些组合在一起。 它是Java编程语言(作为面向对象语言)的一种特殊属性,它没有顶级函数,也没有没有TypeElement
全局变量,在这些函数中定义它们。
换句话说,如果您编写Java程序,您将始终至少有一个包含至少一个类型声明的.java
源文件。 该TypeElement
可能包含至少一个ExecutableElement
来组成一个有用的软件。 TypeElement
可能包含多个ExecutableElement
, VariableElement
和嵌套的TypeElement
。 这是你的程序的结构 。
类型是您在声明成员或局部变量时使用的东西,也是在声明超类或接口时使用的类型。 但是,让我们关注变量,以便更好地理解:
变量可以有一个原始类型,它是编程语言固有的,它也可以有一个隐含存在的类型,例如当存在类型X
,你也可以在变量声明中使用数组类型X[]
,但只有声明的类型是必须具有相应TypeElement
的类型,表示开发人员编写的(或者由工具生成)。 generics也允许你组合类型,例如声明一个类型为Set extends Number>
的变量Set extends Number>
Set extends Number>
而Set
和Number
是声明的类型 ,它们具有相应的程序元素……
如何区分行话元素与类型? 例如:类元素与类类型有何不同? 请帮我举个例子。
您可以将DeclaredType
(type)视为类的generics类型(例如List
); 与TypeElement
(element)相比,它基本上忽略了generics类型(例如List
)。
您可以从元素开始,并构建generics类型:
// Utility elements that come with javax.annotation.processing Elements elements = processingEnv.getElementUtils(); Types types = processingEnv.getTypeUtils(); // These are elements, they never have generic types associated TypeElement listElement = elements.getTypeElement(List.class.getName()); TypeElement strElement = elements.getTypeElement(String.class.getName()); // Build a Type: List DeclaredType listStrType = types.getDeclaredType( listElement, strElement.asType()); // Build a Type: List> DeclaredType listlistStrType = types.getDeclaredType( listElement, listElement.asType(), listStrType);
首先,我必须承认我不是Java大师,但发现你的问题很有趣并花了一些时间来学习它。 这是我发现的。
在我看来,整个概念与generics有很大关系。 如本答案所述: https : //stackoverflow.com/a/2127320/4250114
TypeElement
是静态定义的类型,例如List
, List extends SomeType>
List extends SomeType>
。 而DeclaredType
是一个像List
这样的具体类型。
关于这个概念的一些额外见解给了我Types#getDeclaredType
方法的javadoc:
返回与type元素和实际类型参数对应的类型。 例如,给定{@code Set}的类型元素和{@code String}的类型镜像,此方法可用于获取参数化类型{@code Set}。
如引用问题( https://stackoverflow.com/a/2127266/4250114 )中的另一个答案所述,如果你想了解更多Gilad Bracha和David Ungar的论文应该是一个好地方(至少我要去至 ;) )。
当然你也可以自己试验。 例如,我编写了这样的处理器,我正在使用调试器进行检查:
@SupportedAnnotationTypes({"annotationProcessor.MyAnnotation"}) @SupportedSourceVersion(SourceVersion.RELEASE_8) public class AnnotationProcessor extends AbstractProcessor { @Override public synchronized void init(ProcessingEnvironment processingEnv) { super.init(processingEnv); final Map.Entry collection = getType("java.util.Collection"); final Map.Entry string = getType("java.util.String"); } @Override public boolean process(Set extends TypeElement> annotations, RoundEnvironment roundEnv) { return false; } private Types typeUtils() { return processingEnv.getTypeUtils(); } private Map.Entry getType(String className) { TypeElement typeElement = processingEnv.getElementUtils().getTypeElement(className); DeclaredType declaredType = typeUtils().getDeclaredType(typeElement); return new HashMap.SimpleEntry<>(typeElement, declaredType); } }
希望它有所帮助……