Element是自定义APT的基础,主要作用是在执行AbstractProcessor时,搜索和解析java文件。本文主要是根据官方API来带大家理解Element。
Element位于:javax.lang.model.element包下。先看一下Element的官方解释:
Represents a program element such as a package, class, or method.
Each element represents a static, language-level construct (and not, for example, a runtime construct of the virtual machine).
即element是代表程序的一个元素,这个元素可以是:包、类/接口、属性变量、方法/方法形参、泛型参数。element是java-apt(编译时注解处理器)技术的基础,因此如果要编写此类框架,熟悉element是必须的。
先看一下Element的实现类:
首先分析Element接口结构
asType():
用于获取当前元素(Element,以下均 称元素)的类型(当该元素是类的时,返回完整类名),比方说当前元素是java.lang.String类型,则执行Element.asType().toString得到结果为:java.lang.String。
getKind():
用于获取元素类型,类型有如下:PACKAGE(包),ENUM(枚举),CLASS(类),ANNOTATION_TYPE(注解),INTERFACE(接口),ENUM_CONSTANT(枚举常量),FIELD(属性),PARAMETER(参数),LOCAL_VARIABLE(本地变量),EXCEPTION_PARAMETER(异常处理程序的参数),METHOD(方法),CONSTRUCTOR(构造方法),STATIC_INIT(静态初始化),INSTANCE_INIT(单例初始化),TYPE_PARAMETER, OTHER,RESOURCE_VARIABLE.
getModifiers():
获取修饰符,修饰符有以下:
PUBLIC,PROTECTED,PRIVATE,ABSTRACT,STATIC,FINAL,TRANSIENT,VOLATILE,SYNCHRONIZED,NATIVE,STRICTFP,DEFAULT。这些修饰符与java中的修饰符相对应。
getSimpleName():
获取变量名、方法名、类名(非全路径).例如:
// 方法元素调用getSimpleName(),获取的是方法名:"creatProduct"
IProduct creatProduct(String key);
// 类、接口、枚举等元素getSimpleName(),获取的是类名,如下获得的是:"Factory"
public class Factory
{
}
// 变量(包含参数、属性等)获取的是变量名,此处是:"name"
String name = "张三";
getEnclosingElements():
返回该元素所包含的元素,相当于在当前元素向里解一层。比如当前元素类型是class,getEnclosingElements()可以获取该类所包含的所有成员变量和方法。当前是包元素是,返回该包下的所有类元素。
getEnclosingElement():
返回该元素的所在包的Element,例如下面的IProduct元素调用getEnclosingElement返回的是com.kim.ynarc.factory(包元素):
注意:包元素getEnclosingElement()返回是null
package com.kim.ynarc.factory;
public interface IProduct
{}
getAnnotationMirrors():
用于获取注解镜像,在自定义的类时,由于还jvm还没有加载,此方法可以用来反射自定义的类。
getAnnotation():
accept(ElementVisitor<R, P> v, P p):
接收一个ElementVisitor类,它的作用类似于一个if(element instanceof ExecutableElement) 则调用 visitExecutable(ExecutableElement executableElement, Void aVoid);两个泛型一般写Void就行,如果需要接收accept方法的返回值,则根据返回值的类型定义R,P基本上是用不到的,写Void就行
下面说一说继承Element的接口
包元素:PackageElement
Name getQualifiedName():
获取完整的包名;
方法元素:ExecutableElement:
List<? extends TypeParameterElement> getTypeParameters():获取形参,用于泛型;
TypeMirror getReturnType():获取返回值类型:
List<? extends VariableElement> getParameters():获取参数元素;
List<? extends TypeMirror> getThrownTypes():获取抛出的异常 元素;
变量元素:VariableElement
Object getConstantValue():如果属性变量被final修饰,则可以使用该方法获取它的值
类元素(包括接口,枚举等):TypeElement
NestingKind getNestingKind():此类型元素的嵌套种类,用于判别是内部类还是顶级类等
Name getQualifiedName():获取完整类名;
TypeMirror getSuperclass():获取该类的父类元素;
List<? extends TypeMirror> getInterfaces():获得该类实现的接口元素;
List<? extends TypeParameterElement> getTypeParameters():获取泛型
参数元素:Parameterizable
泛型元素:TypeParameterElement
QualifiedNameable:
为了更改的理解这些类的用处,建议在调试状态下运行代码,即可调试查看。如不了解怎么debug apt,可以参考我的另外一篇文章:自定义APT之:调试