文章目录

  • 一、编译时注解
  • 二、编译时注解 使用
  • 三、注解的保留时间
  • 四、博客资源

一、编译时注解


上一篇博客 【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】编译时技术 ( 开发编译时注解 )相关推荐

  1. 【Android APT】注解处理器 ( 根据注解生成 Java 代码 )

    文章目录 一.生成 Java 代码 二.实现 IButterKnife 接口 三.视图绑定主要操作 四.完整注解处理器代码 五.博客资源 Android APT 学习进阶路径 : 推荐按照顺序阅读 , ...

  2. 【Android APT】注解处理器 ( Element 注解节点相关操作 )

    文章目录 一.获取被 注解 标注的节点 二.Element 注解节点类型 三.VariableElement 注解节点相关操作 四.注解处理器 完整代码示例 五.博客资源 Android APT 学习 ...

  3. 【Android APT】注解处理器 ( 配置注解依赖、支持的注解类型、Java 版本支持 )

    文章目录 一.注解处理器 依赖 编译时注解 二.设置 注解处理器 支持的注解类型 三.设置 注解处理器 支持的 Java 版本 四.博客资源 Android APT 学习进阶路径 : 推荐按照顺序阅读 ...

  4. 【Android APT】注解处理器 ( 注解标注 与 初始化方法 )

    文章目录 一.注解处理器 AbstractProcessor 二.使用注解 @AutoService(Processor.class) 标注 注解处理器 三.注解处理器 init 初始化方法 四.注解 ...

  5. 【错误记录】Android 编译时技术版本警告 ( 注解处理器与主应用支持的 Java 版本不匹配 )

    文章目录 一.报错信息 二.问题分析 三.解决方案 一.报错信息 在使用 Android 编译时技术 , 涉及 编译时注解 , 注解处理器 ; 开发注解处理器后 , 编译报如下警告 ; 该警告不会影响 ...

  6. 【字节码插桩】Android 打包流程 | Android 中的字节码操作方式 | AOP 面向切面编程 | APT 编译时技术

    文章目录 一.Android 中的 Java 源码打包流程 1.Java 源码打包流程 2.字符串常量池 二.Android 中的字节码操作方式 一.Android 中的 Java 源码打包流程 Ja ...

  7. 【Android APT】编译时技术 ( 编译时注解 和 注解处理器 依赖库 )

    文章目录 一.编译时注解和注解处理器 二.创建 编译时注解 和 注解处理器 三.添加 编译时注解 和 注解处理器 依赖库依赖 四.博客资源 一.编译时注解和注解处理器 上一篇博客 [Android A ...

  8. 【Android APT】编译时技术 ( ButterKnife 原理分析 )

    文章目录 一.编译时技术简介 二.ButterKnife 原理分析 二.ButterKnife 生成 Activity_ViewBinding 代码分析 一.编译时技术简介 APT ( Annotat ...

  9. 【错误记录】Android 编译时技术报错 ( 注解处理器 process 方法多次调用问题 )

    文章目录 一.报错信息 二.问题分析 三.解决方案 注解处理器 AbstractProcessor 中的 process 方法可能会调用多次 , 在生成代码时 , 一定要注意 , 检测到 注解节点 后 ...

最新文章

  1. python中setup函数的用法_Vue 3 setup 函数
  2. BZOJ.3277.串(广义后缀自动机)
  3. nokia : Booklet 3G
  4. asp.net发布网站的详细步骤
  5. 马吕斯定律matlab拟合,Matlab插值模拟在光的偏振中的应用
  6. linux为mysql创建gpower_系统运维|RHEL/CentOS 7中安装并配置 PowerDNS 和 PowerAdmin
  7. C语言求二阶矩阵最小值,C语言科学计算入门之矩阵乘法的相关计算
  8. 【Alpha】Scrum Meeting 10
  9. Arcgis Javascript API 开发笔记
  10. win10-用户忘记密码如何登录
  11. 20190904_chip-seq/ ATAC-seq/DAP-seq 原理理解
  12. 电脑wifi密码查看
  13. 再读《谁说大象不能跳舞》
  14. android垂直进度条控件,Android常用控件之ProgressBar,水平进度条
  15. 了解掌握Java的循环语句、条件语句、分支语句(Java 从自学到就业 第3天)
  16. 2022 Java 知识点总结
  17. 喜马拉雅xm文件转换为mp3?
  18. 典型的FPGA芯片有哪些,看完这篇文章就知道了
  19. linux 笔记本电脑_符合Linux的笔记本电脑供应商和产品
  20. StataJournal来啦!随便看(2001-2020)更新到2020年第2期

热门文章

  1. 代码混淆工具Dotfuscator 在VS2008中的使用步骤
  2. 为什么ORM性能比iBATIS好?
  3. char,TCHAR,WCHAR区别
  4. Documentum常见问题10-修改特定Type的显示图标
  5. 尚学堂requireJs课程---2、模块
  6. linux系统/var目录的作用
  7. 1.1 MySQL 逻辑架构
  8. 使用String.intern减少内存使用
  9. 世界32条谣言,你被骗了多少?
  10. arch Linux 安装完,无法通过 SSH 远程连接 root 用户问题