注解是一个类,一个声明就是一个对象
1. 简单注解
@SuppressWarnings("msg") - 压缩/抑制警告
@Deprecated - 声明过时
@Override - 声明复写
2. 自定义注解
1 public @interface Anno { 2 }
3. 注解的使用
1 @Anno 2 public class AnnoTest { 3 public static void main(String[] args) { 4 if(AnnoTest.class.isAnnotationPresent(Anno.class)) { 5 Anno anno = (Anno)AnnoTest.class.getAnnotation(Anno.class); 6 ... 7 } 8 } 9 }
但是在这里我们发现:无法获取到Anno的实例,是因为Anno注解在加载进内存时去除了
以此引出注解的生命周期:
源文件:RetentionPolicy.SOURCE(如SuppressWarnings及Override)
class文件:RetentionPolicy.CLASS(默认)
内存字节码:RetentionPolicy.RUNTIME(如Deprecated)
4. 重定义注解
1 @Retention(RetentionPolicy.RUNTIME) 2 public @interface Anno { 3 }
5. 元注解
元注解:对注解进行注解的注解(@Retention、@Target、@Documented和@Inherited)-> java.lang.annotation
@Retention:设置注解的可见性(生命周期)
@Target:设置注解的作用目标
@Documented:指示javadoc应该为注解生成文档
@Inherited:指示在子类继承父类时继承本注解
6. 注解的作用范围
Target元注解:@Target(ElementType[])
如:@Target({ElementType.TYPE, ElementType.METHOD})
@Target(ElementType.TYPE) // 一个元素可以省略{}
ElementType.
TYPE:所有元素(类、接口、枚举...)
PARAMETER:参数
PACKAGE:包
METHOD:方法
LOCAL_VARIABLE:局部变量
FIELD:属性
CONSTRUCTOR:构造器
ANNOTATION_TYPE:注解
7. 为注解加属性(方法)
注解中属性的类型:八种基本类型、String、Class(ClassName.class)、enum以及上述类型的数组
1 @Retention(RetentionPolicy.RUNTIME) 2 public @interface Anno { 3 String color(); 4 } 5 6 @Anno(color="red") 7 public class AnnoTest { 8 public static void main(String[] args) { 9 if(AnnoTest.class.isAnnotationPresent(Anno.class)) { 10 Anno anno = (Anno)AnnoTest.class.getAnnotation(Anno.class); 11 System.out.println(anno.color()); 12 } 13 } 14 }
8. 为注解属性添加默认值
若注解内只有一个属性且名为value或除value外其他属性均有默认值时,赋值时可以省略value,如下:
1 @Retention(RetentionPolicy.RUNTIME) 2 public @interface Anno { 3 String value(); 4 } 5 6 @Retention(RetentionPolicy.RUNTIME) 7 public @interface Anno2 { 8 String color() default "red";// 为属性设置默认值 9 String value(); 10 int[] array() default {1, 2, 3}; 11 Anno annotation() default @Anno("Joshua"); // 注解中属性为注解 12 } 13 14 @Anno("Joshua") 15 @Anno2("Joshua_AW") 16 public class AnnoTest { 17 public static void main(String[] args) { 18 if(AnnoTest.class.isAnnotationPresent(Anno.class)) { 19 Anno anno = (Anno)AnnoTest.class.getAnnotation(Anno.class); 20 System.out.println(anno.value()); 21 } 22 } 23 }
Anno2也可也这样引用:@Anno2(color="blue", value="Joshua", array=1)