APT(Annotation Processing Tool)

javaPoet是什么?

实战项目结构

注解的定义 
package com.wust.arouter_annotations; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import
java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** *
ClassName: ARouter <br/> * Description: <br/> * date: 2022/2/10 15:13<br/> * *
@author yiqi<br /> * @QQ 1820762465 * @微信 yiqiideallife * @技术交流QQ群 928023749 */
@Target(ElementType.TYPE) // 类上面 @Retention(RetentionPolicy.CLASS) // 编译期
public @interface ARouter { String path(); String group() default ""; }

注解处理器 依赖配置 的添加

* 配置文件的编写  plugins { id 'java-library' } dependencies { implementation
fileTree(dir: 'libs', includes: ['*.jar']) //背后的服务 --> 帮我们自动监视代码的编译 compileOnly
'com.google.auto.service:auto-service:1.0-rc3' annotationProcessor
'com.google.auto.service:auto-service:1.0-rc4'
//帮助我们通过类调用的形式来生成Java代码【javaPoet】 implementation 'com.squareup:javapoet:1.9.0'
//依赖注解 implementation project(":arouter-annotations") } java {
sourceCompatibility = JavaVersion.VERSION_1_7 targetCompatibility =
JavaVersion.VERSION_1_7 }
* 配置文件编写位置

app项目依赖注解配置并使用 

* app项目依赖 注解模块 配置的添加 

*  app项目使用 注解模块 定义的注解 package com.wust.newmodueljavapoet; import
android.app.Activity; import android.os.Bundle; import
androidx.annotation.Nullable; import com.wust.arouter_annotations.ARouter; /**
* ClassName: MainActivity <br/> * Description: <br/> * date: 2022/2/10
16:14<br/> * * @author yiqi<br /> * @QQ 1820762465 * @微信 yiqiideallife *
@技术交流QQ群 928023749 */ @ARouter(path = "MainActivity") public class MainActivity
extends Activity { @Override protected void onCreate(@Nullable Bundle
savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); } }
注解处理器类处理方法的完善
package com.wust.compiler; import com.google.auto.service.AutoService; import
java.io.File; import java.util.Set; import
javax.annotation.processing.AbstractProcessor; import
javax.annotation.processing.Filer; import javax.annotation.processing.Messager;
import javax.annotation.processing.ProcessingEnvironment; import
javax.annotation.processing.RoundEnvironment; import
javax.annotation.processing.SupportedAnnotationTypes; import
javax.annotation.processing.SupportedSourceVersion; import
javax.lang.model.SourceVersion; import javax.lang.model.element.TypeElement;
import javax.lang.model.util.Elements; import javax.lang.model.util.Types; /**
* ClassName: ARouterProcessor <br/> * Description: <br/> * date: 2022/2/10
16:20<br/> * * @author yiqi<br /> * @QQ 1820762465 * @微信 yiqiideallife *
@技术交流QQ群 928023749 */ @AutoService(Processor.class) //启用服务 ,看清楚,别选择成了
Process.class,否则你死活看不到执行这个注解处理器
@SupportedSourceVersion(SourceVersion.RELEASE_7) //环境的配置
@SupportedAnnotationTypes("com.wust.arouter_annotations.ARouter") //明确这个注解处理器
处理 哪个注解 public class ARouterProcessor extends AbstractProcessor { //操作 Element
的工具类(类,函数,属性,其实都是Element) private Elements elementTool;
//type(类信息)的工具类,包含用于操作TypeMirror的工具方法 private Types typeTool; //Message用来打印
日志相关信息 private Messager messager; //文件生成器,类 资源 等,就是最终要生成的文件 是需要Filer来完成的
private Filer filer; @Override public synchronized void
init(ProcessingEnvironment processingEnv) { super.init(processingEnv); //初始化
elementTool = processingEnv.getElementUtils(); messager =
processingEnv.getMessager(); filer = processingEnv.getFiler(); } //在编译的时候干活
@Override public boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) { return false; } }
注解处理器如何拿到Android代码

总体思路:只有通过 gradle 来实现

* app项目下的build.gradle中进行配置 //传递参数 javaCompileOptions {
annotationProcessorOptions { arguments = [MyName: 'yiqi'] } }

//依赖注解处理器 注解处理器才能工作 annotationProcessor project(":compiler")

* 接收参数  ···省略··· /** * ClassName: ARouterProcessor <br/> * Description: <br/>
* date: 2022/2/10 16:20<br/> * * @author yiqi<br /> * @QQ 1820762465 * @微信
yiqiideallife * @技术交流QQ群 928023749 */ //接收 安卓工程传递过来的参数
@SupportedOptions("MyName") ···省略··· public class ARouterProcessor extends
AbstractProcessor { ···省略··· @Override public synchronized void
init(ProcessingEnvironment processingEnv) { super.init(processingEnv); ···省略···
//输出获取到的值 String value = processingEnv.getOptions().get("MyName");
messager.printMessage(Diagnostic.Kind.NOTE, "heheheh>" + value); } //在编译的时候干活
@Override public boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) { messager.printMessage(Diagnostic.Kind.NOTE,
"process is run"); return false; } }
运行结果展示

项目结构梳理图 

 

技术
今日推荐
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:766591547
关注微信