Java注解
Java注解定义
- 注解本身没有任何意义,单独的注解就是一种注释,他需要结合其他如反射,插桩等技术才有意义。
- Java注解(Annotation)又称Java标注,是JDK1.5引入的一种注解机制。是元数据的一种形式,提供有关程序但不属于程序本身的数据。注解对他们注解的代码没有直接影响。
元注解
在定义注解时,注解类也能够使用其他的注解声明。对注解类型进行注解的注解类,我们称之为 meta-annotation(元注解)。声明的注解允许作用于哪些节点使用@Target声明;保留级别由@Retention 声明。
@Target声明 如下
- ElementType.ANNOTATION_TYPE 可以应用于注解类型
- ElementType.CONSTRUCTOR 可以应用于构造函数
- ElementType.FIELD 可以应用于字段或属性
- ElementType.LOCAL_VARIABLE 可以应用于局部变量
- ElementType.METHOD 可以应用于方法级注解
- ElementType.PACKAGE 可以应用于包声明
- ElementType.PARAMETER 可以应用于方法的参数
- ElementType.TYPE 可以应用于类的任何元素
@Retention其中保留级别 如下
- RetentionPolicy.SOURCE
- 标记的注解仅保留在源级别中,并被编译器忽略。
- RetentionPolicy.CLASS
- 标记的注解在编译时由编译器保留,但 Java 虚拟机(JVM)会忽略。
- RetentionPolicy.RUNTIME
- 标记的注解由 JVM 保留,因此运行时环境可以使用它。
注解应用场景
- 源码级别-APT
- 在编译期能够获取注解与注解声明的类包括类中所有成员信息,一般用于生成额外的辅助类。
- 字节码级别-字节码增强技术
- 在编译出Class后,通过修改Class数据以实现修改代码逻辑目的。对于是否需要修改的区分或者修改为不同逻辑的判断可以使用注解。
- 运行时-反射
- 在程序运行期间,通过反射技术动态获取注解与其元素,从而完成不同的逻辑判定。
注解使用
@Target({ElementType.PARAMETER}) //表示作用在参数上
@Retention(RetentionPolicy.SOURCE) //表示仅保留在源码
public @interface ThemeAction{ }
//使用这个注解可以标记在参数上 如果放在方法上编辑器就是提示报错
public static void findAction(@ThemeAction String action) {}