元注解
- 元注解顾名思义我们可以理解为注解的注解,它是作用在注解中,方便我们使用注解实现想要的功能。元注解分别有@Retention、 @Target、 @Document、 @Inherited和@Repeatable(JDK1.8加入)五种。
@Target
表示该注解可以用在什么地方
- ANNOTATION_TYPE 可以应用于注释类型
- CONSTRUCTOR 可以应用于构造函数
- FIELD 可以应用于字段或属性
- LOCAL_VARIABLE 可以应用于局部变量
- METHOD 可以应用于方法级注释
- PACKAGE 可以应用于包声明
- PARAMETER 可以应用于方法的参数
- TYPE 可以应用于类的任何元素
@Retention
表示注解存在阶段是保留在源码(编译期),字节码(类加载)或者运行期(JVM中运行)
- SOURCE,注解仅存在于源码中,在class字节码文件中不包含
- CLASS, 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得
- RUNTIME, 注解会在class字节码文件中存在,在运行时可以通过 ***反射 *** 获取到
不同引用有什么不同?(应用场景)
级别 技术 说明 源码 APT
ide代码检查在编译期能够获取注解与注解声明的类包扩类中所有成员信息,一般用于生成额外的辅助类。 字节码 字节码增强 在编译出Class后,通过修改Class数据实现修改代码逻辑的目的。例如是否需要修改和修改为不同逻辑的判断 运行时 反射 在运行期间,通过反射技术动态获取注解与其元素,从而完成不同的逻辑判定。 APT如何运行的?
运行在编译阶段
.java -> javac -> .class
javac解析java类->采集所有的注解信息->包装成Element->javac调起注解处理程序,不需要手动调用APT如何实现
1,在android工程中,创建一个java的Module,写一个类继承AbstractProcessor
2,在继承AbstractProcessor类中的process方法,处理我们自定义的注解
3,在项目Gradle中添加auto-service和aptmodule的引用
4,生成的源代码在build/generated/source/apt下可以看到
字节码增强
在字节码中写代码
.class -> 格式(数据按照特定的方式记录与排列)
.class 通过IO -> byte[],修改
@Documented
表示将此注解包含在Javadoc中
@Inherited
表示允许子类继承父类中的注解