当前位置:   article > 正文

【Android组件化】一文教你玩转APT_super apt

super apt

APT(Annotation Processing Tool)


javaPoet是什么?


实战项目结构


注解的定义 


  1. package com.wust.arouter_annotations;
  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. import java.lang.annotation.Target;
  6. /**
  7. * ClassName: ARouter <br/>
  8. * Description: <br/>
  9. * date: 2022/2/10 15:13<br/>
  10. *
  11. * @author yiqi<br />
  12. * @QQ 1820762465
  13. * @微信 yiqiideallife
  14. * @技术交流QQ群 928023749
  15. */
  16. @Target(ElementType.TYPE) // 类上面
  17. @Retention(RetentionPolicy.CLASS) // 编译期
  18. public @interface ARouter {
  19. String path();
  20. String group() default "";
  21. }

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


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

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


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

  •  app项目使用 注解模块 定义的注解
  1. package com.wust.newmodueljavapoet;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import androidx.annotation.Nullable;
  5. import com.wust.arouter_annotations.ARouter;
  6. /**
  7. * ClassName: MainActivity <br/>
  8. * Description: <br/>
  9. * date: 2022/2/10 16:14<br/>
  10. *
  11. * @author yiqi<br />
  12. * @QQ 1820762465
  13. * @微信 yiqiideallife
  14. * @技术交流QQ群 928023749
  15. */
  16. @ARouter(path = "MainActivity")
  17. public class MainActivity extends Activity {
  18. @Override
  19. protected void onCreate(@Nullable Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.activity_main);
  22. }
  23. }

注解处理器类处理方法的完善


  1. package com.wust.compiler;
  2. import com.google.auto.service.AutoService;
  3. import java.io.File;
  4. import java.util.Set;
  5. import javax.annotation.processing.AbstractProcessor;
  6. import javax.annotation.processing.Filer;
  7. import javax.annotation.processing.Messager;
  8. import javax.annotation.processing.ProcessingEnvironment;
  9. import javax.annotation.processing.RoundEnvironment;
  10. import javax.annotation.processing.SupportedAnnotationTypes;
  11. import javax.annotation.processing.SupportedSourceVersion;
  12. import javax.lang.model.SourceVersion;
  13. import javax.lang.model.element.TypeElement;
  14. import javax.lang.model.util.Elements;
  15. import javax.lang.model.util.Types;
  16. /**
  17. * ClassName: ARouterProcessor <br/>
  18. * Description: <br/>
  19. * date: 2022/2/10 16:20<br/>
  20. *
  21. * @author yiqi<br />
  22. * @QQ 1820762465
  23. * @微信 yiqiideallife
  24. * @技术交流QQ群 928023749
  25. */
  26. @AutoService(Processor.class) //启用服务 ,看清楚,别选择成了 Process.class,否则你死活看不到执行这个注解处理器
  27. @SupportedSourceVersion(SourceVersion.RELEASE_7) //环境的配置
  28. @SupportedAnnotationTypes("com.wust.arouter_annotations.ARouter") //明确这个注解处理器 处理 哪个注解
  29. public class ARouterProcessor extends AbstractProcessor {
  30. //操作 Element 的工具类(类,函数,属性,其实都是Element)
  31. private Elements elementTool;
  32. //type(类信息)的工具类,包含用于操作TypeMirror的工具方法
  33. private Types typeTool;
  34. //Message用来打印 日志相关信息
  35. private Messager messager;
  36. //文件生成器,类 资源 等,就是最终要生成的文件 是需要Filer来完成的
  37. private Filer filer;
  38. @Override
  39. public synchronized void init(ProcessingEnvironment processingEnv) {
  40. super.init(processingEnv);
  41. //初始化
  42. elementTool = processingEnv.getElementUtils();
  43. messager = processingEnv.getMessager();
  44. filer = processingEnv.getFiler();
  45. }
  46. //在编译的时候干活
  47. @Override
  48. public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
  49. return false;
  50. }
  51. }

注解处理器如何拿到Android代码


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

  • app项目下的build.gradle中进行配置
  1. //传递参数
  2. javaCompileOptions {
  3. annotationProcessorOptions {
  4. arguments = [MyName: 'yiqi']
  5. }
  6. }

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

  • 接收参数 
  1. ···省略···
  2. /**
  3. * ClassName: ARouterProcessor <br/>
  4. * Description: <br/>
  5. * date: 2022/2/10 16:20<br/>
  6. *
  7. * @author yiqi<br />
  8. * @QQ 1820762465
  9. * @微信 yiqiideallife
  10. * @技术交流QQ群 928023749
  11. */
  12. //接收 安卓工程传递过来的参数
  13. @SupportedOptions("MyName")
  14. ···省略···
  15. public class ARouterProcessor extends AbstractProcessor {
  16. ···省略···
  17. @Override
  18. public synchronized void init(ProcessingEnvironment processingEnv) {
  19. super.init(processingEnv);
  20. ···省略···
  21. //输出获取到的值
  22. String value = processingEnv.getOptions().get("MyName");
  23. messager.printMessage(Diagnostic.Kind.NOTE, "heheheh>" + value);
  24. }
  25. //在编译的时候干活
  26. @Override
  27. public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
  28. messager.printMessage(Diagnostic.Kind.NOTE, "process is run");
  29. return false;
  30. }
  31. }

运行结果展示


项目结构梳理图 


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/224152
推荐阅读
相关标签
  

闽ICP备14008679号