Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【Android APT】编译时技术 ( 开发编译时注解 )

【Android APT】编译时技术 ( 开发编译时注解 )

作者头像
韩曙亮
发布于 2023-03-29 04:43:50
发布于 2023-03-29 04:43:50
28000
代码可运行
举报
运行总次数:0
代码可运行

文章目录

一、编译时注解


上一篇博客 【Android APT】编译时技术 ( 编译时注解 和 注解处理器 依赖库 ) 中创建并配置了 annotation 编译时注解 依赖库 和 annotation-compiler 注解处理器 依赖库 ;

本博客开始进行开发 编译时注解 依赖库 ;

开发 annotation 编译时注解 依赖库 ;

右键点击包名 , 选择 " New / Java Class " 选项 ,

在弹出的对话框中 , 选择 " Annotation " 注解对话框 , 然后输入注解名称 BindView ,

注解源码开发 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 构建脚本 依赖库相关配置 如下 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 注解 , 这是我们自定义的注解 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;

    @Override
    protected 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) 修饰的 , 说明该注解是 运行时注解 , 该注解需要从源码 到 字节码 一直保留 , 知道运行时才开始解析该注解 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Retention(RUNTIME) @Target(FIELD)
public @interface BindView {
  /** View ID to which the field will be bound. */
  @IdRes int value();
}

查看 Override 注解的源码如下 , 该注解被 @Retention(RetentionPolicy.SOURCE) 修饰 , 说明该注解是 源码期注解 , 注解信息仅在源码阶段保存 , 一旦编译成字节码文件 , 高注解就被删除了 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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 注解 是 运行时注解 , 该注解需要在运行时使用 , 需要一直保留到运行时 ;

四、博客资源


博客源码 :

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-05-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Android APT】编译时技术 ( ButterKnife 原理分析 )
APT ( Annotation Processing Tool ) 注解处理工具 ;
韩曙亮
2023/03/29
5260
【IOC 控制反转】Android 视图依赖注入 ( 视图依赖注入步骤 | 视图依赖注入代码示例 )
Android 依赖注入的核心就是通过反射获取 类 / 方法 / 字段 上的注解 , 以及注解属性 ; 在 Activity 基类中 , 获取该注解 以及 注解属性 , 进行相关操作 ;
韩曙亮
2023/03/29
7060
【IOC 控制反转】Android 视图依赖注入 ( 视图依赖注入步骤 | 视图依赖注入代码示例 )
【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入代码示例 )
Android 依赖注入的核心就是通过反射获取 类 / 方法 / 字段 上的注解 , 以及注解属性 ; 在 Activity 基类中 , 获取该注解 以及 注解属性 , 进行相关操作 ;
韩曙亮
2023/03/29
3220
【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入代码示例 )
编译时注解apt / kapt
一个注解允许你把额外的元数据关联到一个声明上。然后元数据就可以被相关的源代码工具访问,通过编译好的类文件或是在运行时,取决于这个注解是如何配置的。 --《Kotlin in Action》
蜻蜓队长
2019/04/25
1.8K0
编译时注解apt / kapt
【IOC 控制反转】Android 布局依赖注入 ( 布局依赖注入步骤 | 布局依赖注入代码示例 )
Android 依赖注入的核心就是通过反射获取 类 / 方法 / 字段 上的注解 , 以及注解属性 ; 在 Activity 基类中 , 获取该注解 以及 注解属性 , 进行相关操作 ;
韩曙亮
2023/03/29
8910
【IOC 控制反转】Android 布局依赖注入 ( 布局依赖注入步骤 | 布局依赖注入代码示例 )
提高10倍开发效率?APT如何让Android开发变得更轻松
在Android开发中,APT(Annotation Processing Tool)是一种强大的工具,它可以让开发者在编译期间处理注解,生成额外的代码。通过APT,我们可以实现很多高级功能,比如自动生成代码、实现依赖注入、生成路由表等。本文将深入探讨APT的运用以及背后的原理。
Rouse
2024/03/18
1480
提高10倍开发效率?APT如何让Android开发变得更轻松
Android 注解与注解处理器简述
  在Android开发中,注解是非常多的,如果不去了解,你可能感受不到注解的存在,一些框架用到的注解是很多的,例如Butterknife、Retrofit、Dagger2、Hilt、ViewBinding、DataBinding等等,下面简单的来了解一下注解。
晨曦_LLW
2022/10/24
7080
Android 注解与注解处理器简述
【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
2790
使用编译时注解简单实现类似 ButterKnife 的效果
本文介绍了如何通过自定义APT生成Java代码,并分析了生成代码的过程和具体实现。同时,本文还提供了关于自定义APT的代码示例和具体应用场景的详细说明。
张拭心 shixinzhang
2018/01/05
1.6K0
使用编译时注解简单实现类似 ButterKnife 的效果
【Android 组件化】路由组件 ( 路由框架概述 )
路由框架 仅限于在 集成模式 下使用 , 组件模式下 , 路由框架不起任何作用 ;
韩曙亮
2023/03/29
5330
【Android APT】注解处理器 ( Element 注解节点相关操作 )
Android APT 学习进阶路径 : 推荐按照顺序阅读 , 从零基础到开发简易 ButterKnife 注解框架的学习路径 ;
韩曙亮
2023/03/29
2390
【Android APT】注解处理器 ( Element 注解节点相关操作 )
Android注解快速入门和实用解析
文章较长,欢迎收藏后浅斟慢酌。主要介绍和分析了 RUNTIME 和 CLASS 下两种注解的使用,也欢迎讨论留言。
GSYTech
2018/08/22
4190
Android注解快速入门和实用解析
【Android 组件化】路由组件 ( 页面跳转参数依赖注入 )
在 组件化 中 , 使用 路由组件 进行界面跳转时 , 涉及到参数的传递 , 传递过去的参数需要在目的地 Activity 的 onCreate 方法中 , 调用 getIntent().getXxxExtra() 获取到传递的值 ;
韩曙亮
2023/03/29
9020
【IOC 控制反转】Android 事件依赖注入 ( 事件三要素 | 修饰注解的注解 | 事件依赖注入步骤 )
Android 依赖注入的核心就是通过反射获取 类 / 方法 / 字段 上的注解 , 以及注解属性 ; 在 Activity 基类中 , 获取该注解 以及 注解属性 , 进行相关操作 ;
韩曙亮
2023/03/29
8930
【Java 注解】自定义注解 ( 元注解 )
@Target 注解用于说明该注解作用位置 , ElementType.METHOD 表示该注解用于标注 方法 ; 注解的作用位置 : 包 , 类 , 成员变量 , 方法 , 方法参数 , 局部变量 , 6 个作用位置 ;
韩曙亮
2023/03/29
1.2K0
【Java 注解】自定义注解 ( 元注解 )
Android APT(编译时代码生成)最佳实践
越来越多第三方库使用apt技术,如DBflow、Dagger2、ButterKnife、ActivityRouter、AptPreferences。在编译时根据Annotation生成了相关的代码,非常高大上但是也非常简单的技术,可以给开发带来了很大的便利。
用户1269200
2018/07/30
1.4K0
【Android APT】编译时技术 ( 编译时注解 和 注解处理器 依赖库 )
上一篇博客 【Android APT】编译时技术 ( ButterKnife 原理分析 ) 简单介绍了下编译时技术 , 并简单分析了 ButterKnife 的实现原理 ;
韩曙亮
2023/03/29
3920
【Android APT】编译时技术 ( 编译时注解 和 注解处理器 依赖库 )
19 浅析 Java 注解(Annotation)
Java 5之后可以在源代码中嵌入一些补充信息,这种补充信息称为注解(Annotation),例如在方法覆盖中使用过的@Override注解,注解都是@符号开头的。
acc8226
2022/05/17
2180
19 浅析 Java 注解(Annotation)
Java匹马行天下之JavaSE核心技术——注解
注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,没有加,则等于没有任何标记,以后,javac编译器、开发工具和其他程序可以通过反射来了解你的类及各种元素上有无何种标记,看你的程序有什么标记,就去干相应的事,标记可以加在包、类,属性、方法,方法的参数以及局部变量上。
泰斗贤若如
2019/06/19
4100
Java匹马行天下之JavaSE核心技术——注解
推荐阅读
相关推荐
【Android APT】编译时技术 ( ButterKnife 原理分析 )
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验