编译时注解学习一之 Element元素
前面的文章学习java基础之注解,掌握了注解的基本用法。使用系统或者大神写的框架库提供给我们注解,可以省略好多配置,特别是java Spring开发中注解更是多的眼花缭乱。最近需要用到编译时注解,所以就对AbstractProcessor进行深入的学习,首先对javax.lang.model.element进行学习。
Element 是一个接口,它只在编译期存在和Type有区别,表示程序的一个元素,可以是package,class,interface,method,成员变量,函数参数,泛型类型等。
它的子类包括ExecutableElement, PackageElement, Parameterizable, QualifiedNameable, TypeElement, TypeParameterElement, VariableElement。
Element的子类介绍:
-
ExecutableElement:表示类或者接口中的方法,构造函数或者初始化器。
-
PackageElement :表示包程序元素
-
TypeELement:表示一个类或者接口元素
-
TypeParameterElement:表示类,接口,方法的泛型类型例如T。
-
VariableElement:表示字段,枚举常量,方法或者构造函数参数,局部变量,资源变量或者异常参数。
Element只在编译期可见,通过Element可以获取什么信息呢,如何获取呢。下面是jdk中对Element的说明:
函数介绍:
asType() 返回TypeMirror,TypeMirror是元素的类型信息,包括包名,类(或方法,或参数)名/类型。TypeMirror的子类有ArrayType, DeclaredType, DisjunctiveType, ErrorType, ExecutableType, NoType, NullType, PrimitiveType, ReferenceType, TypeVariable, WildcardType ,getKind可以获取类型。
equals(Object obj) 比较两个Element利用equals方法。
getAnnotation(Class<A> annotationType) 传入注解可以获取该元素上的所有注解。
getAnnotationMirrors() 获该元素上的注解类型。
getEnclosedElements() 获取该元素上的直接子元素,类似一个类中有VariableElement。
getEnclosingElement() 获取该元素的父元素,如果是PackageElement则返回null,如果是TypeElement则返回PackageElement,如果是TypeParameterElement则返回泛型Element
getKind() 返回值为ElementKind,通过ElementKind可以知道是那种element,具体就是Element的那些子类。
getModifiers() 获取修饰该元素的访问修饰符,public,private。
getSimpleName() 获取元素名,不带包名,如果是变量,获取的就是变量名,如果是定义了int age,获取到的name就是age。如果是TypeElement返回的就是类名。
getQualifiedName():获取类的全限定名,Element没有这个方法它的子类有,例如TypeElement,得到的就是类的全类名(包名)。
获取所在的包名:
Elements.getPackageOf(enclosingElement).asType().toString()