本节主要大致整理一下注解的内容。
定义
1 2
| public @interface TestAnnotation { }
|
元注解
用来修饰注解的注解,对于这些元注解还是需要牢记
@Retention
这个元注解表示注解的生命周期
分为源码阶段(SOURCE),编译阶段(CLASS)和运行阶段(RUNTIME)
@Documented
非功能性的注解,表示要不要将此注解包含到javadoc中
@Target
表示注解可以标记在什么位置,是类,还是方法还是等等
取值不一一说明
@Inherited
被Inherited修饰的注解标记到class A上,class B继承自class A,那么class B也拥有了此标记。
@Repeatable
被Repeatable修饰的注解表示当前注解可以重复的标记到目标位置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface TestAnnotations {
TestAnnotation[] value(); }
@Repeatable(TestAnnotations.class) @Retention(RetentionPolicy.RUNTIME) @Documented @Target({ElementType.TYPE, ElementType.METHOD}) public @interface TestAnnotation {
String value() default ""; }
@TestAnnotation(value = "a") @TestAnnotation(value = "b") public class User { }
|
注解属性
在自定义的注解里面添加属性
1 2 3 4
| public @interface TestAnnotation {
String value() default ""; }
|
这里需要注意的是属性为value时,在使用时可以省略name值,写成@TestAnnotation(“a”)
注解的提取
这里演示被Repeatable修饰后的注解的提取
1 2 3 4 5 6 7 8 9 10
| public void test() { boolean b = User.class.isAnnotationPresent(TestAnnotations.class); if (b) { TestAnnotations testAnnotations = User.class.getAnnotation(TestAnnotations.class); TestAnnotation[] annotations = testAnnotations.value(); for (TestAnnotation t : annotations) { System.out.println(t.value()); } } }
|
用法
注解就像一个记号一样,思考你的代码在哪些地方需要做一下标记,标记完后再找到具有这些标记的地方,完成业务的处理?
参考
1. Java 注解 (Annotation)你可以这样学