一、 四个元注解
@Retention
:用于标明注解的生命周期,可分为3类,分别对应于Java源文件(.java文件) -> .class文件 -> 内存中的字节码 。
RetentionPolicy.SOURCE
:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
RetentionPolicy.CLASS
:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
RetentionPolicy.RUNTIME
:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
@Target
:标明注解的修饰目标。
TYPE
:类、接口(包括注解类型)或枚举
FIELD
:field属性,也包括enum常量使用的注解
METHOD
:方法
PARAMETER
:参数
CONSTRUCTOR
:构造函数
LOCAL_VARIABLE
:局部变量
ANNOTATION_TYPE
:注解上使用的元注解
PACKAGE
:包
TYPE_PARAMETER
:自JDK1.8开始可用。表示该注解能写在类型参数的声明语句中也就是泛型上,类型参数声明如下:<T>,<T extends Person>
TYPE_USE
:自JDK1.8开始可用。表示可以在任何用到类型的地方使用
Documented
:用于描述其它类型的注解应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。
@Inherited
:标记注解,允许子类继承父类的注解。
二、 代码Demo
- 自定义钉钉告警注解
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface DingTalkAlert {
String methodName() default "";
String alertMsg() default "";
boolean atAll() default true;
}
- 注解使用在方法上
@DingTalkAlert(methodName = "test", alertMsg = "alert msg", atAll = true)
public void testMethod() {
}
- 结合拦截器/AOP,对该注解进行相关功能实现。