一、甚么是APT
APT(Annotation Processing Tool)注释CPU,是javac的两个辅助工具,它能在源代码聚合class的这时候,处置Java句法树。lombok的基本原理,在校对期修正二进制码,聚合get和set方式。
上面他们就采用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.本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
2.分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3.不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4.本站提供的源码、模板、插件等其他资源,都不包含技术服务请大家谅解!
5.如有链接无法下载或失效,请联系管理员处理!
6.本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
-
免费下载或者VIP会员资源能否直接商用?本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
-
提示下载完但解压或打开不了?最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。 若排除这种情况,可在对应资源底部留言,或联络我们。
-
找不到素材资源介绍文章里的示例图片?对于会员专享、整站源码、程序插件、网站模板、网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
-
付款后无法显示下载地址或者无法查看内容?如果您已经成功付款但是网站没有弹出成功提示,请联系站长提供付款信息为您处理
-
购买该资源后,可以退款吗?源码素材属于虚拟商品,具有可复制性,可传播性,一旦授予,不接受任何形式的退款、换货要求。请您在购买获取之前确认好 是您所需要的资源