通过注解实现面向切片编程的核心步骤
- 定义注解
- 实现解析注解的代码
- 使用注解
定义注解
声明的方式
- 对于JavaType.java文件,我们常用的是用来声明类(class)或接口(interface)或者
1
2public class JavaType{
}这里我们使用@interface来定义一个annnotation注解1
2public interface JavaType{
}1
2public JavaType{
}
在@interface上使用注解
@Target注解
- 用来声明注解的使用目标,常见@Target的值有:ElementType.Method用于方法,ElementType.Type用于类型(包括java类、接口、注解), ElementType.Parameter用于方法参数,还有更多枚举可以从ElementType中找到具体定义
1
2
public interface JavaType{}
@Retention注解
- 使用有道词典翻译是保持力的名词意思,此注解的@Target声明的是ANNOTATION_TYPE,用于为注解类型提供声明
- @Retention配置的值从RetentionPolicy.java枚举中选择,可选值为SOURCE,CLASS,RUNTIME
- SOURCE定义的注解保留在源代码中,不编译到Class中去,如@Override和@SuppressWarnings注解使用本策略
- CLASS定义的注解会保留到class文件,但是运行期间不会识别此注解
- RUNTIME定义的注解会被保留到class文件中,同时运行期间也会被识别,AOP中使用的注解一般情况下使用本策略
@Documented
- 用于javadoc的一个注解,声明注解时使用了本注解时,在到处javadoc时,在javadoc中就能看到目标的注解声明
在一个注解中定义方法
- 定义一:基本使用,使用default关键字
1
2
3
4
5
6
7
8import java.lang.annotation.*;
public JavaType {
String value() default "";
} - 使用一
1
2
3
4public class Test{
public void typeA(){}
} - 关键字default指定默认值,默认值必须是与元素的数据类型兼容的类型
- 定义二: 使用枚举
1
2
3
4
5
6
7
8import java.lang.annotation.*;
public JavaType {
RetentionPolicy value() default RetentionPolicy.RUNTIME;
} - 使用二
1
2
3
4
5
6
7import java.lang.annotation.RetentionPolicy;
public class Test {
public void typeA() {
}
} - 定义三:使用数组
1
2
3
4
5
6
7
8import java.lang.annotation.*;
public Target {
ElementType[] value();
} - 使用三
1 | import java.lang.annotation.ElementType; |