Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >android APT 使用

android APT 使用

原创
作者头像
木子杂志
修改于 2020-08-07 07:08:01
修改于 2020-08-07 07:08:01
56200
代码可运行
举报
文章被收录于专栏:木子杂志木子杂志
运行总次数:0
代码可运行

什么是 APT

APT(Annotation Processing Tool)即注解处理器,是一种处理注解的工具.简单来说就是在编译期,根据代码中的注解依据相应的规则生成.java文件.

使用
1.创建 自定义注解
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.TYPE, ElementType.FIELD})
public @interface JetInject {
   String value() default "";
}

@Retention(RetentionPolicy.CLASS)
@Target({ElementType.TYPE, ElementType.FIELD})
public @interface IRouter {
   /**
    * 该参数当前仅仅支持在activity中使用,表示路由列表
    * @return
    */
   String[] value() default {};
}
2.创建 java-library类型的 module 作为 compiler
  • 自定义 AbstractProcessor,并且用@AutoService注解标记AutoService会自动在META-INF文件夹下生成Processor配置信息文件,该文件里就是注解处理器的全称
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
com.xxx.appcompiler.compiler.Compiler

自动生成如下文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
app.compiler/build/classes/java/main/META-INF/services/javax.annotation.processing.Processor
//javax.annotation.processing.Processor 内容如下:
com.xxx.appcompiler.compiler.Compiler

如果不使用 Google 的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
com.google.auto.service:auto-service

这个库,则需要写如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1.需要在 processors 库的 main 目录下新建 resources 资源文件夹
2.在 resources文件夹下建立 META-INF/services 目录文件夹
3.META-INF/services 目录文件夹下创建 javax.annotation.processing.Processor 文件
4.在 javax.annotation.processing.Processor 文件写入注解处理器的全称,包括包路径
com.xxx.appcompiler.compiler.Compiler
  • Compiler类内容
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@AutoService(Processor.class)
public class Compiler extends AbstractProcessor {
   //process方法会执行多次 这个 flag 用来 保证执行一次
   private boolean isFirst;

   @Override
   public Set<String> getSupportedAnnotationTypes() {
       //将我们自定义的注解添加Set集合
       Set<String> types = new LinkedHashSet<>();
       types.add(JetInject.class.getCanonicalName());
       types.add(IRouter.class.getCanonicalName());
       types.add(JetInit.class.getCanonicalName());
       return types;
  }

   @Override
   public SourceVersion getSupportedSourceVersion() {
       return SourceVersion.latestSupported();
  }

   @Override
   public synchronized void init(ProcessingEnvironment processingEnvironment) {
       super.init(processingEnvironment);
       ProcessingManager manager = ProcessingManager.get();
       manager.setElementUtils(processingEnv.getElementUtils());
       manager.setFiler(processingEnv.getFiler());
       manager.setMessager(processingEnv.getMessager());
       manager.setTypeUtils(processingEnv.getTypeUtils());
  }

   @Override
   public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnv) {

       if (isFirst) {
           return false;
      }
       processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "---------jet begin --------------------");
       isFirst = true;
       EleParser.getInstance().initPreCode();

       Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(JetInject.class);
       Set<? extends Element> routers = roundEnv.getElementsAnnotatedWith(IRouter.class);
       if (!init(roundEnv)) {
           return true;
      }
       for (Element ele : elements) {
           if (ele.getKind() == ElementKind.FIELD) {
               EleParser.getInstance().parser(processingEnv, ele, false, true);
          } else if (ele.getKind() == ElementKind.CLASS) {
               EleParser.getInstance().parser(processingEnv, ele, true, true);
          }
      }
       for (Element ele : routers) {
           if (ele.getKind() == ElementKind.CLASS) {
               EleParser.getInstance().parser(processingEnv, ele, true, false);
          }
      }
       //使用javapoet生成代码
       EleParser.getInstance().build();
       return true;
  }
}

生成的代码路径

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
app/build/generated/source/apt/debug/com/xxx/androidcompileractivity/JetInitializer.java

更多内容 欢迎关注公众号

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
编译时注解(一)AbstractProcessor实战
Java中的注解(Annotation)是一个很神奇的东西,特别现在有很多Android库都是使用注解的方式来实现的。 我们并不讨论那些在运行时(Runtime)通过反射机制运行处理的注解,而是讨论在编译时(Compile time)处理的注解。下面便入手学习下Java注解处理器。
提莫队长
2019/02/21
7.4K1
【Android APT】注解处理器 ( 注解标注 与 初始化方法 )
上一篇博客 【Android APT】编译时技术 ( 开发编译时注解 ) 中 开发 了 annotation 编译时注解 依赖库 , 很简单 , 只有一个 BindView 注解 ;
韩曙亮
2023/03/29
3660
Annotation Processor
要了解Annotation Processor,首先需要先了解什么是 Annotation。 Annotation : 是 Java 注解。 例如常见的 @Override @Nullable 等, 可以对类或者字段进行标记。 这些标记可以在反射时读取 或者 通过 Annotation Processor进行解析来自动生成一些对应的代码。
艳龙
2021/12/16
5330
Java编译时注解自动生成代码[通俗易懂]
在开始之前,我们首先申明一个非常重要的问题:我们并不讨论那些在运行时(Runtime)通过反射机制运行处理的注解,而是讨论在编译时(Compile time)处理的注解。注解处理器是一个在javac中的,用来编译时扫描和处理的注解的工具。可以为特定的注解,注册自己的注解处理器。
全栈程序员站长
2022/09/01
2.7K0
Android 自定义编译时注解1 - 简单的例子
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/70244169
程序员徐公
2018/09/17
4050
Android 自定义编译时注解1 - 简单的例子
Android APT(编译时代码生成)最佳实践
越来越多第三方库使用apt技术,如DBflow、Dagger2、ButterKnife、ActivityRouter、AptPreferences。在编译时根据Annotation生成了相关的代码,非常高大上但是也非常简单的技术,可以给开发带来了很大的便利。
用户1269200
2018/07/30
1.4K0
聊聊如何运用JAVA注解处理器(APT)
APT(Annotation Processing Tool)它是Java编译期注解处理器,它可以让开发人员在编译期对注解进行处理,通过APT可以获取到注解和被注解对象的相关信息,并根据这些信息在编译期按我们的需求生成java代码模板或者配置文件(比如SPI文件或者spring.fatories)等。APT获取注解及生成代码都是在代码编译时候完成的,相比反射在运行时处理注解大大提高了程序性能
lyb-geek
2023/04/11
9120
聊聊如何运用JAVA注解处理器(APT)
【Android】APT
介绍 APT(Annotation Processing Tool)即注解处理器,是一种处理注解的工具,确切的说它是javac的一个工具,它用来在编译时扫描和处理注解。注解处理器以Java代码(或者编译过的字节码)作为输入,生成.java文件作为输出。 简单来说就是在编译期,通过注解生成.java文件。 作用 使用APT的优点就是方便、简单,可以少些很多重复的代码。 用过ButterKnife、Dagger、EventBus等注解框架的同学就能感受到,利用这些框架可以少些很多代码,只要写一些注解就可以了。
Gavin-ZYX
2018/05/18
1.1K0
【Android APT】注解处理器 ( 根据注解生成 Java 代码 )
Android APT 学习进阶路径 : 推荐按照顺序阅读 , 从零基础到开发简易 ButterKnife 注解框架的学习路径 ;
韩曙亮
2023/03/29
2850
Java注解编译期处理AbstractProcessor详解
平时我们接触的框架大部分都是运行时注解,比如:@Autowire @Resoure @Bean 等等。
石臻臻的杂货铺[同名公众号]
2023/04/17
2.8K0
Java注解编译期处理AbstractProcessor详解
Java中的注解处理器是什么,提供一个自定义注解处理器的实际案例
Java中的注解处理器(Annotation Processor)是一种在编译时期处理注解的工具,它可以通过扫描和解析源代码中的注解信息,生成额外的代码、配置文件或者进行其他特定的处理操作。注解处理器能够帮助开发者实现自定义的代码生成、静态分析、验证等功能,从而提高开发效率和代码质量。
用户1289394
2024/06/11
1740
Java中的注解处理器是什么,提供一个自定义注解处理器的实际案例
使用编译时注解简单实现类似 ButterKnife 的效果
本文介绍了如何通过自定义APT生成Java代码,并分析了生成代码的过程和具体实现。同时,本文还提供了关于自定义APT的代码示例和具体应用场景的详细说明。
张拭心 shixinzhang
2018/01/05
1.6K0
使用编译时注解简单实现类似 ButterKnife 的效果
手写 ButterKnife BindView
先建三个module,分别为Butterknife ButterKnife-Annotions ButterKnife-compiler,其中butterknife为Android Module其余的都是Java Module 。
曾大稳
2018/09/11
5860
【Android APT】注解处理器 ( Element 注解节点相关操作 )
Android APT 学习进阶路径 : 推荐按照顺序阅读 , 从零基础到开发简易 ButterKnife 注解框架的学习路径 ;
韩曙亮
2023/03/29
2420
【Android APT】注解处理器 ( Element 注解节点相关操作 )
聊聊AbstractProcessor和Java编译流程
我:我写过一个路由跳转库,我通过了AbstractProcessor生成了路由表的注册类。
逮虾户
2020/10/15
4.7K0
聊聊AbstractProcessor和Java编译流程
apt 与 JavaPoet 自动生成代码
吴涛
2017/10/26
4.6K0
apt 与 JavaPoet 自动生成代码
@lombok注解背后的原理是什么,让我们走近自定义Java注解处理器
本文介绍了如何自定义Java注解处理器及涉及到的相关知识,看完本文可以很轻松看懂并理解各大开源框架的注解处理器的应用。
程序员黄小斜
2021/11/23
8020
Android 编译时注解 —— 语法详解
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/70822023
程序员徐公
2018/09/17
7740
用kotlin实现activity路由框架的ProcessorProcessor的原理下载安装特性使用方法总结
页面路由框架,无论在android还是在iOS的开发中都是很常见的模块与模块之间的解耦工具,特别是对中大型App而言,基本上都会有自己的路由框架。
fengzhizi715
2018/08/24
7330
用kotlin实现activity路由框架的ProcessorProcessor的原理下载安装特性使用方法总结
“终于懂了” 系列:组件化框架 ARouter 完全解析(二)APT技术
在上一篇《“终于懂了” 系列:组件化框架 ARouter 完全解析(一) 原理详解》中,详细介绍了ARouter的核心原理。其中提到了“帮助类”的概念,也就是在运行时生成 用于帮助填充WareHouse路由元信息的类,这里就涉及到了APT技术。那么本篇就对这一技术点进行介绍,并详细分析ARouter中是如何使用APT来生成帮助类的。
胡飞洋
2022/11/08
1.7K0
“终于懂了” 系列:组件化框架 ARouter 完全解析(二)APT技术
推荐阅读
相关推荐
编译时注解(一)AbstractProcessor实战
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验