<br><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">Java APT 是 Java 技术设计的一个 APT 架构,</p><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">APT(Annotation Processing Tool)即注解处理器,它是一种处理注解的工具,也是javac中的一个工具,用于在编译阶段未生成class之前对源码中的注解进行扫描和处理。</p><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">APT可以用来在编译时扫描和处理注解,?它可以用来获取到注解和被注解对象的相关信息,在拿到这些信息后我们可以根据需求来自动的生成一些代码,省去了手动编写。 在Android中有如ButterKnife、Dagger、E【【微信】】等第三方框架,都采用了APT。</p><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">常用的使用方式是这样的:</p><blockquote style="margin-top:5px;margin-bottom:5px;padding-left:1em;margin-left:0px;border-left:3px solid rgb( 238 , 238 , 238 )"><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">APT + 注解处理器(AbstractProcess)+ 代码处理(javaPoet)+ 处理器注册(AutoService)</p><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">这里我们了解下相关概念:</p><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">APT</p><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">是一个工具,可以用于检查源代码中的注解,并生成相应的代码。</p><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">AbstractProcess:</p><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">是 Java 中的一个抽象类,用于定义一个处理程序或者一个抽象的执行环境。在 Java 的编程过程中,经常需要在类的开头或者方法中加入注解,来标记这个方法或者类是抽象的,或者是实现了某个接口。这时候,AbstractProcess 类就可以用来定义注解处理器,用来处理这些注解。</p><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">APT框架中的核心类是AbstractProcessor,它定义了如何在代码中处理注解。当APT工具扫描文件时,它会调用实现AbstractProcessor类的一个或多个类的process()方法,以捕获和处理注解。</p></blockquote><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">Ja【【微信】】ing Tool(APT)是一个预处理器,可以在Java代码编译期间读取注解,并生成相关的代码。</p><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">它的工作原理如下:</p><ol style="list-style-type:decimal;margin:0px;padding-left:23px;font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none"><li>Java编译器会将源文件传递给APT进行处理;</li><li>APT会扫描源文件中所有的注解,并找到对应的处理器;</li><li>处理器会对注解进行处理,并生成新的Java代码文件(或其他文件);</li><li>生成的Java代码文件被编译成字节码文件;</li><li>编译器将生成的字节码文件和原始Java代码文件一起打包成jar包或class文件。</li></ol><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">APT通过Java标准类库中的jav【【微信】】.processing包提供注解处理的框架。注解处理器必须实现该包中的特定接口,这些接口定义了APT框架的核心功能。通过实现接口,注解处理器能够直接访问来自编译器的数据,以及用于注解处理的元数据信息。注解处理器总是运行在 Java 编译环境中。</p><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">APT的使用可以帮助简化一些重复、冗杂的代码生成工作。</p><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">使用<span style="color:#fe2c24"><strong>运行时注解</strong></span>的方式实战简单APT,这个比较简单,就是用反射的方式来实现,</p><div><div style="border:1px solid rgb( 232 , 232 , 232 );max-width:750px;color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:rgb( 249 , 249 , 249 )"><div style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"><pre style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )">【【微信】】(Context 【【微信】】) { </span></span><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"> // 1. 获取当前class </span></span><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"> Class<?> clazz = 【【微信】】.getClass(); </span></span><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"> // 2. 根据class获取class上面的注解 </span></span><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"> InjectContenttLayout annotation = clazz.getAnnotation(InjectContenttLayout.class); </span></span><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"> // 3. 获取注解中布局文件的id的值 </span></span><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"> int layoutId = annotation.value(); </span></span><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"> try { </span></span><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"> // 4. 获取activity中的setContentView方法 </span></span><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"> Method method = clazz.getMethod("setContentView", int.class); </span></span><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"> // 5. 执行setContentView方法,传入layoutId参数 </span></span><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"> method.invoke(【【微信】】, layoutId); </span></span><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"> } catch (Exception e) { </span></span><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"> } </span></span><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"><span style="color:rgb( 24 , 24 , 24 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )"> }</span></span></pre></div></div></div><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">使用<span style="color:#fe2c24"><strong>编译时注解</strong></span>的方式实战简单APT,手写ButterKnife框架,我们来写一下布局文件view的注入,比如我们不想写烦人的find【【微信】】方法,直接用个注解来搞定,</p><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">本 Demo 下载</p><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">其核心思想是java的ioc(【【微信】】),也叫di(dependency injection,依赖注入),是一种面向对象编程中的设计模式。下面我们开始</p><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">编辑</p><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">创建一个Ja【【微信】】名称叫 </p><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">在这个module中创建自定义注解 </p><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">编辑</p><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">创建一个Ja【【微信】】名称叫?apt-compiler-p<br>..天猫互助是什么意思,天猫互助是什么意思,2023天猫互助一天可以点几次赞,这是一个友善和互相支持的淘宝理想生活狂欢季天猫互助次数怎么算,欢迎你加入我们的大家庭! 亲爱的朋友,我加入了一个积极向上的2023 618天猫狂欢盛典天猫互助是什么意思,大家互相帮助、共同完成任务。你有兴趣一起加入吗?
本文地址:
/show-90172.html
版权声明:除非特别标注原创,其它均来自互联网,转载时请以链接形式注明文章出处。


