自定义APT基础之:Element

7 篇文章 1 订阅

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接口的结构实现关系
首先分析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_PARAMETEROTHER,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之:调试

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值