首页 > 代码库 > JDK5-注解

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 }

  元注解:对注解进行注解的注解(@Retention与@Target)-> java.lang.annotation

  

5. 注解的作用范围

  Target元注解:@Target(ElementType[])

    如:@Target({ElementType.TYPE, ElementType.METHOD})

      @Target(ElementType.TYPE)  // 一个元素可以省略{}

  ElementType.

    TYPE:类、接口、枚举...

    PARAMETER:参数

    PACKAGE:包

    METHOD:方法

    LOCAL_VARIABLE:局部变量

    FIELD:属性

    CONSTRUCTOR:构造器

    ANNOTATION_TYPE:注解

 

6. 为注解加属性(方法)

注解中属性的类型:八种基本类型、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 }

 

7. 为注解属性添加默认值  

  若注解内只有一个属性且名为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="http://www.mamicode.com/Joshua", array=1)

JDK5-注解