JDK5-注解

注解是一个类,一个声明就是一个对象

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)

原文地址:https://www.cnblogs.com/joshua-aw/p/6021291.html