package annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target({ElementType.METHOD,ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)/** * 元注解: 元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。 @Retention、@Documented、@Target、@Inherited、@Repeatable 1.@Retention RetentionPolicy.RUNTIME 注解会在class字节码文件中存在,在运行时可以通过反射获取到 RetentionPolicy.CLASS 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得 RetentionPolicy.SOURCE 注解仅存在于源码中,在class字节码文件中不包含 2.@Documented 顾名思义,这个元注解肯定是和文档有关。它的作用是能够将注解中的元素包含到 Javadoc 中去。 3.@Target 是目标的意思,@Target 指定了注解运用的地方。 @Target({ElementType.METHOD,ElementType.TYPE}) ElementType.ANNOTATION_TYPE 可以给一个注解进行注解 ElementType.CONSTRUCTOR 可以给构造方法进行注解 ElementType.FIELD 可以给属性进行注解 ElementType.LOCAL_VARIABLE 可以给局部变量进行注解 ElementType.METHOD 可以给方法进行注解 ElementType.PACKAGE 可以给一个包进行注解 ElementType.PARAMETER 可以给一个方法内的参数进行注解 ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举 4.@Inherited 是继承的意思,但是它并不是说注解本身可以继承,而是说如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。 说的比较抽象 @Inherited @Retention(RetentionPolicy.RUNTIME) @interface Test {} @Test public class A {} public class B extends A {} 注解 Test 被 @Inherited 修饰,之后类 A 被 Test 注解,类 B 继承 A,类 B 也拥有 Test 这个注解。 5.@Repeatable Repeatable 自然是可重复的意思。@Repeatable 是 Java 1.8 才加进来的,所以算是一个新的特性。 @Person(role="artist") @Person(role="coder") @Person(role="PM") public class SuperMan{} 没有属性时 括号可省略 @Auth * * */public @interface Auth { /** * 注解只有成员变量,没有方法。注解的成员变量在注解的定义中以“无形参的方法”形式来声明 * 在注解中定义属性时它的类型必须是 8 种基本数据类型外加 类、接口、注解及它们的数组。 * @return */ String value() default ""; String [] name(); String group() default "group1"; }/** * * 注解的获取 * * 1类注解 * TestAnnotation testAnnotation = Test.class.getAnnotation(TestAnnotation.class); * 2成员变量注解获取 * Field a = Test.class.getDeclaredField("a"); a.setAccessible(true); //获取一个成员变量上的注解 Check check = a.getAnnotation(Check.class); 3.方法上的注解获取 Method testMethod = Test.class.getDeclaredMethod("testMethod"); Annotation[] ans = testMethod.getAnnotations(); for( int i = 0;i < ans.length;i++) { System.out.println("method testMethod annotation:"+ans[i].annotationType().getSimpleName()); } * * * */