当我们使用AOP 的时候,遇到自定义注解的时候
@Retention(RetentionPolicy.RUNTIME) //注解保留在程序运行期间,此时可以通过反射获得定义在某个类上的所有注解。
@Target(ElementType.METHOD) //该注解可以被声明在类的方法前之前
public @interface SystemLog {
String businessName();
}
使用范围
@Retention
用来说明该注解类的生命周期
。它有以下三个参数:
RetentionPolicy.SOURCE : 注解只保留在源文件中
RetentionPolicy.CLASS : 注解保留在class文件中,在加载到JVM虚拟机时丢弃
RetentionPolicy.RUNTIME : 注解保留在程序运行期间,此时可以通过反射获得定义在某个类上的所有注解。
@Target
用来说明该注解可以被声明在哪些元素之前
ElementType.TYPE:说明该注解只能被声明在一个 类 前
ElementType.FIELD:类的字段前
ElementType.METHOD:类的方法前
ElementType.PARAMETER:方法参数前
ElementType.CONSTRUCTOR:类的构造方法前
ElementType.LOCAL_VARIABLE:局部变量前
ElementType.ANNOTATION_TYPE:注解类型前
ElementType.PACKAGE:包名前
示例
/**
* 这是一个自定义的注解(Annotation)类 在定义注解(Annotation)类时使用了另一个注解类Retention
* 在注解类上使用另一个注解类,那么被使用的注解类就称为元注解
*/
@Retention(RetentionPolicy.RUNTIME)
//Retention注解决定MyAnnotation注解的生命周期
@Target( { ElementType.METHOD, ElementType.TYPE })
//Target注解决定MyAnnotation注解可以加在哪些成分上,如加在类身上,或者属性身上,或者方法身上等成分
/*
* @Retention(RetentionPolicy.SOURCE)
* 这个注解的意思是让MyAnnotation注解只在java源文件中存在,编译成.class文件后注解就不存在了
* @Retention(RetentionPolicy.CLASS)
* 这个注解的意思是让MyAnnotation注解在java源文件(.java文件)中存在,编译成.class文件后注解也还存在,
* 被MyAnnotation注解类标识的类被类加载器加载到内存中后MyAnnotation注解就不存在了
*/
/*
* 这里是在注解类MyAnnotation上使用另一个注解类,这里的Retention称为元注解。
* Retention注解括号中的"RetentionPolicy.RUNTIME"意思是让MyAnnotation这个注解的生命周期一直程序运行时都存在
*/
public @interface MyAnnotation {
}
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ApiLog {
/**
* 指定当前接口日志属于哪一个模块
*/
String moduleKey();
/**
* 指定当前接口日志属于指定模块的哪一种操作
*/
String operationKey();
/**
* 日志详情字段
*/
Exp[] exps() default {};
...
}