一、@Documented
@Documented注解表明这个注解会被javadoc之类工具记录,即注解类型信息也会被包括在生成文档中。默认情况下,javadoc是不包括注解的。
二、@Target
@Target注解用于设定注解使用范围
1.@Target(ElementType.TYPE) //接口、类、枚举、注解
2.@Target(ElementType.FIELD) //字段、枚举的常量
3.@Target(ElementType.METHOD) //方法
4.@Target(ElementType.PARAMETER) //方法参数
5.@Target(ElementType.CONSTRUCTOR) //构造函数
6.@Target(ElementType.LOCAL_VARIABLE)//局部变量
7.@Target(ElementType.ANNOTATION_TYPE)//注解
8.@Target(ElementType.package) ///包
这里可以使用多个,比如:@Target({ElementType.TYPE,ElementType.METHOD})
三、@Retention
@Retention注解表明被保留到那个阶段. 有三个值:
1.RetentionPolicy.SOURCE //这种类型的Annotations只在源代码级别保留,编译时就会被忽略,如@Override注解
2.RetentionPolicy.CLASS //这种类型的Annotations编译时被保留,在class文件中存在,但JVM将会忽略
3.RetentionPolicy.RUNTIME // 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用.
四、@Inherited
@Inherited定义在类级别上,子类时可以继承的,@Inherited定义在方法级别上,子类的方法如果复写的那么就不能继承。
五、自定义注解
1.@Test_Cat
可被javadoc记录,用于类上,可用反射机制读取
@Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Test_Cat { String catName() default "cat"; }
2.@Test_WhiteCat
可被javadoc记录,用于类上,可用反射机制读取
@Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Test_WhiteCat { String whiteCatName() default "white cat"; }
3.@Test_Dog
用于类上,可用反射机制读取,可被继承
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface Test_Dog { String dogName() default "dog"; }
4.@Test_BlackDog
用于类上,可用反射机制读取
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Test_BlackDog { String blackDogName() default "black dog"; }
六、注解的使用
AnimalFather类为父类,AnimalSon 为子类。AnimalSon类继承AnimalFather类
@Test_Cat //不可被继承 @Test_Dog //可被继承 class AnimalFather{ } @Test_WhiteCat @Test_BlackDog class AnimalSon extends AnimalFather{ }
七、测试
public class TestMain { public static void main(String[] args) { //反射获得AnimalSon Class<AnimalSon> clazz = AnimalSon.class; System.out.println("- - - - - - Annotation - - - - - -"); for (Annotation annotation : clazz.getAnnotations()) { System.out.println(annotation); } System.out.println("- - - - - - Annotation Method - - - - - -"); //如果有Test_Cat注解 if (clazz.isAnnotationPresent(Test_Cat.class)) { Test_Cat cat = clazz.getAnnotation(Test_Cat.class); System.out.println(cat.catName()); } //如果有Test_Dog注解 if (clazz.isAnnotationPresent(Test_Dog.class)) { Test_Dog dog = clazz.getAnnotation(Test_Dog.class); System.out.println(dog.dogName()); } //如果有Test_WhiteCat注解 if (clazz.isAnnotationPresent(Test_WhiteCat.class)) { Test_WhiteCat whiteCat = clazz.getAnnotation(Test_WhiteCat.class); System.out.println(whiteCat.whiteCatName()); } //如果有Test_BlackDog注解 if (clazz.isAnnotationPresent(Test_BlackDog.class)) { Test_BlackDog blackDog = clazz.getAnnotation(Test_BlackDog.class); System.out.println(blackDog.blackDogName()); } } }
八、结果
1.生成javadoc文档后,查看@Documented注解的效果
在AnimalFather文档中可以看到类上有@Test_Cat注解,无@Test_Dog注解,由此可看到@Documented注解的作用
在AnimalFather文档中可以看到类上有@Test_WhiteCat注解,无@Test_BlackDog注解
2.控制台打印出的结果
AnimalSon没有继承AnimalFather的@Test_Cat注解,继承了@Test_Dog注解,由此可看到@Inherited注解的用法