An annotation is a form of metadata, that can be added to Java source code. Classes, methods, variables, parameters and packages may be annotated. Annotations have no direct effect on the operation of the code they annotate.
- 注解是一种可以添加到Java源代码的元数据. - 类,方法,变量,参数,包都可以被注解. - 注解对注解的代码并没有直接的影响. - **注解仅仅是个标记.注解之所以起作用是对其解析后做了相应的处理**
Annotation分类
元Annotation
自定义Annotation
public @interface CustomAnnotation{***}
@Retention( RetentionPolicy.RUNTIME ) @Target( ElementType.TYPE ) public @interface CustomAnnotation{***}
@Retention( RetentionPolicy.RUNTIME ) @Target( ElementType.TYPE ) public @interface CustomAnnotation{ //注解参数类型可以是1-6中任一种,包括枚举 public enum Skill{JAVA,ANDROID,IOS} Skill mySkill() default Skill.ANDROID; String attr1(); //可以使用default设置默认值 int attr2() default 100; //修饰符只能用public public boolean attr3() default false; } @Retention( RetentionPolicy.RUNTIME ) @Target( ElementType.TYPE ) public @interface CustomAnnotation{ //只有一个注解参数,使用value() String value(); }
1.自定义Annotation的参数类型必须满足上一条1到6中的范围. 2.自定义Annotation的参数访问方法只能是public,或不写. 3.自定义Annotation的参数可以加 default 设置默认值. 4.自定义Annotation若只有1个参数,使用value().
注解元素必须有确定的值,要么在定义注解的默认值中指定,要么在使用注解时指定,非基本类型的注解元素的值不可为null。因此, 使用空字符串或0作为默认值是一种常用的做法。这个约束使得处理器很难表现一个元素的存在或缺失的状态,因为每个注解的声明中,所有元素都存在,并且都具有相应的值,为了绕开这个约束,我们只能定义一些特殊的值,例如空字符串或者负数,一次表示某个元素不存在,在定义注解时,这已经成为一个习惯用法。
`` 示例: @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface AnotherAnnotation{ String author() default ""; int age() default -1; } ```
@CustomAnnotation(attr1 = "属性1", attr2 = 90, attr3 = true) public class AnnotationTestClass{ *** }
Annotation解析
运行时 Annotation 解析
public void testCustomAnnotation() { try { Class cls = Class.forName("com.jet.annotation.AnnotationTestClass"); CustomAnnotation customAnnotation = (CustomAnnotation)cls.getAnnotation(CustomAnnotation.class); System.out.println("customAnnotation mySkill:" + cus.mySkill()); System.out.println("customAnnotation attr1:" + cus.attr1()); System.out.println("customAnnotation attr2:" + cus.attr2()); } catch (ClassNotFoundException e) { e.printStackTrace(); } }
编译时 Annotation 解析
编译时 Annotation 指 @Retention 为 CLASS 的 Annotation,甴编译器自动解析