自动草稿

一、甚么是APT

APT(Annotation Processing Tool)注释CPU,是javac的两个辅助工具,它能在源代码聚合class的这时候,处置Java句法树。lombok的基本原理,在校对期修正二进制码,聚合getset方式。

上面他们就采用APT控制技术, 来手动聚合get和set方式。内含源代码,钟爱的能浏览自学。

自动草稿

钟爱的能朋友圈APT,获取源代码门牌号

责任编辑产品目录非常多不必惧怕,特别是2.6到2.7产品目录,不须要看见那个API就惧怕。也不必做题。介绍就好。 正经人是不能用那个聚合二进制码的,二进制码聚合他们有许多称心的辅助工具。

Javassist或是是javapoet

二、两栖作战模拟

2.1 表述CPU

继承AbstractProcessor

@AutoService(Processor.class)@SupportedAnnotationTypes({“cn.lxchinesszz.MyData”,”cn.lxchinesszz.MyGetter”,”cn.lxchinesszz.MySetter”})// 那个注释CPU是处置哪个注释的@SupportedSourceVersion(SourceVersion.RELEASE_8)public class MyLombokProcessor extends AbstractProcessor { @Override public synchronized void init(ProcessingEnvironment processingEnvironment) {} @Override public boolean process(Set set, RoundEnvironment roundEnv) {}}
@AutoService 谷歌提供的SPI辅助工具。当采用那个注释会自定聚合Java SPI文件, 当然如果不想用谷歌的辅助工具,他们也能自己来写配置文件
├── classes│ ├── META-INF│ │ └── services│ │ └── javax.annotation.processing.Processor
@SupportedAnnotationTypes({“cn.lxchinesszz.MyData”,”cn.lxchinesszz.MyGetter”,”cn.lxchinesszz.MySetter”})

支持的注释类型

@SupportedSourceVersion(SourceVersion.RELEASE_8)

支持的源代码类型

2.2 Element 体系

roundEnv.getElementsAnnotatedWith(MyData.class)能获取被该注释修饰的类或是字段或是方式。

上面他们看下Element的类型。

自动草稿

public class User{ // TypeElement private String name; // VariableElement private Interge age; // VariableElement public String getName(){ // ExecutableElement return this.name; } public void setName( // ExecutableElement String name // VariableElement ){ this.name = name; }}

如何知道Element 的类型呢。

ElementgetKind
自动草稿

2.2.1 获取字段信息

这里他们先自表述两个字段类型来获取基础信息,来自学Element

public class FieldElement extends ModifierElement { /** * 字段名 */ private final String fieldName; /** * 字段类型 */ private Class fieldType; /** * 资源原始类型 */ private final VariableElement fieldElement; /** * 基本类型提示 */ private String remark; /** * 字段所属类 */ private final TypeElement classElement; public FieldElement(String fieldName, VariableElement fieldElement) { super(fieldElement); this.fieldName = fieldName; this.fieldElement = fieldElement; this.classElement = (TypeElement) fieldElement.getEnclosingElement(); try { if (isPrimitive()) { fieldType = null; this.remark = “基本类型:” fieldElement.asType().toString(); } else { this.fieldType = Class.forName(fieldElement.asType().toString()); } } catch (ClassNotFoundException e) { // 如果还报错说明是两个泛型 根据泛型类型来进行处置 fieldElement.asType() // DeclaredType Set // WildcardType // ? // ? extends Number // ? super T this.fieldType = Object.class; } } }
首先先判断是字段类型
public static FieldElement toFiledElement(Element enclosedElement) { if (ElementKind.FIELD.equals(enclosedElement.getKind())) { VariableElement fieldElement = (VariableElement) enclosedElement; Name simpleName = fieldElement.getSimpleName(); return new FieldElement(simpleName.toString(), fieldElement); } else { throw new RuntimeException(“enclosedElement 不是字段类型:” enclosedElement); } }

2.2.1 获取方式信息

方式包括方式参数和返回值,这里他们自表述两个方式参数。
public class MethodElement extends ModifierElement{ /** * 方式参数名 */ private final String methodName; /** * 返回值 */ private Class returnType; /** * 方式原始信息 */ private final ExecutableElement methodElement; /** * 方式参数 */ private final List methodParamElements; public MethodElement(ExecutableElement methodElement, List methodParamElements) { super(methodElement); this.methodName = methodElement.getSimpleName().toString(); try { TypeMirror returnTypeMirror = methodElement.getReturnType(); if (returnTypeMirror instanceof NoType) { this.returnType = Void.TYPE; } else { this.returnType = Class.forName(methodElement.getReturnType().toString()); } } catch (ClassNotFoundException e) { this.returnType = Void.TYPE; } this.methodElement = methodElement; this.methodParamElements = methodParamElements; }}
聚合方式
public static MethodParamElement toMethodParamElement(Element enclosedElement) { if (ElementKind.PARAMETER.equals(enclosedElement.getKind())) { VariableElement fieldElement = (VariableElement) enclosedElement; Name simpleName = fieldElement.getSimpleName(); return new MethodParamElement(simpleName.toString(), fieldElement); } else { throw new RuntimeException(“enclosedElement 不是字段类型:” enclosedElement); } } public static MethodElement toMethodElement(Element enclosedElement) { if (ElementKind.METHOD.equals(enclosedElement.getKind())) { ExecutableElement methodElement = (ExecutableElement) enclosedElement; List parameters = methodElement.getParameters(); List paramElements = new ArrayList

1.本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2.分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3.不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4.本站提供的源码、模板、插件等其他资源,都不包含技术服务请大家谅解!
5.如有链接无法下载或失效,请联系管理员处理!
6.本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!