【Android APT】编译时技术 ( 开发编译时注解 )
文章目录
- 一、编译时注解
- 二、编译时注解 使用
- 三、注解的保留时间
- 四、博客资源
一、编译时注解
上一篇博客 【Android APT】编译时技术 ( 编译时注解 和 注解处理器 依赖库 ) 中创建并配置了 annotation 编译时注解 依赖库 和 annotation-compiler 注解处理器 依赖库 ;
本博客开始进行开发 编译时注解 依赖库 ;
开发 annotation 编译时注解 依赖库 ;
右键点击包名 , 选择 " New / Java Class " 选项 ,
在弹出的对话框中 , 选择 " Annotation " 注解对话框 , 然后输入注解名称 BindView ,
注解源码开发 :
package kim.hsl.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.FIELD)
@Retention(RetentionPolicy.CLASS)
public @interface BindView {int value();
}
元注解解析 :
使用 @Target(ElementType.FIELD) 元注解标注该 BindView 注解 , 说明该 @BindView 注解是作用于成员变量的 ;
使用 @Retention(RetentionPolicy.CLASS) 标注 BindView 注解 , 说明该注解是 编译时注解 ;
注解属性解析 :
使用 value 作为注解属性名 , 并且只有一个 注解属性 , 因此该注解在使用的时候 , 为注解属性赋值可以省略 " value = " , 直接传入注解属性值 ;
二、编译时注解 使用
注释掉之前的 ButterKnife 的 编译时注解 和 注解处理器 , 使用应用中自己开发的 编译时注解 和 注解处理器 ;
build.gradle 构建脚本 依赖库相关配置 如下 :
dependencies {//implementation 'com.jakewharton:butterknife:10.2.3'//annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'annotationProcessor project(path: ':annotation-compiler')implementation project(path: ':annotation')
}
在 MainActivity 中模仿 ButterKnife 使用 @BindView 注解 , 这是我们自定义的注解 ;
package kim.hsl.apt;import android.os.Bundle;
import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;import kim.hsl.annotation.BindView;public class MainActivity extends AppCompatActivity {@BindView(R.id.hello)TextView hello;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//hello.setText("ButterKnife");}
}
下一步开始使用 注解处理器 , 处理上述注解 ;
注解处理器 工作机制 : 当程序在编译时 , 执行注解处理器 , 注解处理器会搜索整个程序中 , 使用到 BindView 注解的位置 , 并获取注解的相关信息 , 所在字节码文件 , 作用位置 ( 类 / 方法 / 字段等 ) ;
三、注解的保留时间
注解分类 :
① 源码期注解 : 注解保留到源码阶段 , 只有当类是 .java 文件时才能看到 , 一旦编译成 .class 字节码文件 , 该注解就消失了 , 如 @Override 仅在编译时查看父类是否有该方法 ;
② 编译时注解 : 注解保留到字节码阶段 ;
③ 运行时注解 : 注解保留到运行时 ;
源码期注解 与 编译时注解 对比示例 :
查看 MainActivity.java 源码 : 该源码中有两个注解 @BindView 和 @Override 两个注解 ;
查看 BindView 注解的源码如下 , 其中 BindView 注解是被 @Retention(RUNTIME) 修饰的 , 说明该注解是 运行时注解 , 该注解需要从源码 到 字节码 一直保留 , 知道运行时才开始解析该注解 ;
@Retention(RUNTIME) @Target(FIELD)
public @interface BindView {/** View ID to which the field will be bound. */@IdRes int value();
}
查看 Override 注解的源码如下 , 该注解被 @Retention(RetentionPolicy.SOURCE) 修饰 , 说明该注解是 源码期注解 , 注解信息仅在源码阶段保存 , 一旦编译成字节码文件 , 高注解就被删除了 ;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {}
编译应用后 , 查看 MainActivity.class 字节码文件 , 该字节码文件在 " APT\app\build\intermediates\javac\debug\classes\kim\hsl\apt " 目录下 ;
字节码文件中的 @Override 注解已经消失 , @BindView 注解还存在 ;
@Override 注解是 源码期注解 , 只保留到源码期 , 编译时使用该注解 , 编译完成后 , 该注解就被删除了 ;
@BindView 注解 是 运行时注解 , 该注解需要在运行时使用 , 需要一直保留到运行时 ;
四、博客资源
博客源码 :
GitHub : https://github.com/han1202012/APT
CSDN : https://download.csdn.net/download/han1202012/18885375
【Android APT】编译时技术 ( 开发编译时注解 )相关推荐
- 【Android APT】注解处理器 ( 根据注解生成 Java 代码 )
文章目录 一.生成 Java 代码 二.实现 IButterKnife 接口 三.视图绑定主要操作 四.完整注解处理器代码 五.博客资源 Android APT 学习进阶路径 : 推荐按照顺序阅读 , ...
- 【Android APT】注解处理器 ( Element 注解节点相关操作 )
文章目录 一.获取被 注解 标注的节点 二.Element 注解节点类型 三.VariableElement 注解节点相关操作 四.注解处理器 完整代码示例 五.博客资源 Android APT 学习 ...
- 【Android APT】注解处理器 ( 配置注解依赖、支持的注解类型、Java 版本支持 )
文章目录 一.注解处理器 依赖 编译时注解 二.设置 注解处理器 支持的注解类型 三.设置 注解处理器 支持的 Java 版本 四.博客资源 Android APT 学习进阶路径 : 推荐按照顺序阅读 ...
- 【Android APT】注解处理器 ( 注解标注 与 初始化方法 )
文章目录 一.注解处理器 AbstractProcessor 二.使用注解 @AutoService(Processor.class) 标注 注解处理器 三.注解处理器 init 初始化方法 四.注解 ...
- 【错误记录】Android 编译时技术版本警告 ( 注解处理器与主应用支持的 Java 版本不匹配 )
文章目录 一.报错信息 二.问题分析 三.解决方案 一.报错信息 在使用 Android 编译时技术 , 涉及 编译时注解 , 注解处理器 ; 开发注解处理器后 , 编译报如下警告 ; 该警告不会影响 ...
- 【字节码插桩】Android 打包流程 | Android 中的字节码操作方式 | AOP 面向切面编程 | APT 编译时技术
文章目录 一.Android 中的 Java 源码打包流程 1.Java 源码打包流程 2.字符串常量池 二.Android 中的字节码操作方式 一.Android 中的 Java 源码打包流程 Ja ...
- 【Android APT】编译时技术 ( 编译时注解 和 注解处理器 依赖库 )
文章目录 一.编译时注解和注解处理器 二.创建 编译时注解 和 注解处理器 三.添加 编译时注解 和 注解处理器 依赖库依赖 四.博客资源 一.编译时注解和注解处理器 上一篇博客 [Android A ...
- 【Android APT】编译时技术 ( ButterKnife 原理分析 )
文章目录 一.编译时技术简介 二.ButterKnife 原理分析 二.ButterKnife 生成 Activity_ViewBinding 代码分析 一.编译时技术简介 APT ( Annotat ...
- 【错误记录】Android 编译时技术报错 ( 注解处理器 process 方法多次调用问题 )
文章目录 一.报错信息 二.问题分析 三.解决方案 注解处理器 AbstractProcessor 中的 process 方法可能会调用多次 , 在生成代码时 , 一定要注意 , 检测到 注解节点 后 ...
最新文章
- python中setup函数的用法_Vue 3 setup 函数
- BZOJ.3277.串(广义后缀自动机)
- nokia : Booklet 3G
- asp.net发布网站的详细步骤
- 马吕斯定律matlab拟合,Matlab插值模拟在光的偏振中的应用
- linux为mysql创建gpower_系统运维|RHEL/CentOS 7中安装并配置 PowerDNS 和 PowerAdmin
- C语言求二阶矩阵最小值,C语言科学计算入门之矩阵乘法的相关计算
- 【Alpha】Scrum Meeting 10
- Arcgis Javascript API 开发笔记
- win10-用户忘记密码如何登录
- 20190904_chip-seq/ ATAC-seq/DAP-seq 原理理解
- 电脑wifi密码查看
- 再读《谁说大象不能跳舞》
- android垂直进度条控件,Android常用控件之ProgressBar,水平进度条
- 了解掌握Java的循环语句、条件语句、分支语句(Java 从自学到就业 第3天)
- 2022 Java 知识点总结
- 喜马拉雅xm文件转换为mp3?
- 典型的FPGA芯片有哪些,看完这篇文章就知道了
- linux 笔记本电脑_符合Linux的笔记本电脑供应商和产品
- StataJournal来啦!随便看(2001-2020)更新到2020年第2期