黑马程序员--java基础加强之注释(Annotation)

                                                                                                                                                                                                                                                         

一、注释:相当于一种标记,也是类的一种,可以加在包、类、字段、方法以及方法的参数上;(java.lang.annotation)

二、种类:

          1、@Suppress Warnings

             该注释关闭了类或方法级别的编译器警告。有时候您比编译器更清楚地知道,代码必须使用一个被否决的方法或执行一些无法静态确定是否类型安全的动作,而使用:

              @SuppressWarnings("deprecation")

                public static void selfDestruct() {

                Thread.currentThread().stop();

                }

         2、@Deprecated

               该注释用于提醒某些方法是过时的

         3、@Override

             Override表示,它所注释的方法应该重写超类中具有相同签名的方法:

              public int hashCode() {

                  ...

             

    看上面的例子,如果没有在hashCode中将“C”大写,在编译时不会出现错误,但是在运行时将无法像期望的那样调用该方法。通过添加Override标签,编译器会提示它是否真正地执行了重写。

         4、其他注释:java.lang.annotation包中

三、注释在开发中的应用

        1、注解的应用结构;

             1)注解类

             @interface A{}

             2)应用了"注解类"的类

             @A

             class B{}

             3)对应用了"注解类的类"进行反射操作的类

             class C{

             B.class.isAnnotationPresent(A.class);

             A a = B.class.getAnnotation(A.class);

             }

实例应用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//1、定义一个注解类,实际开发中需要放到单独的类中      
   @Retention(RetentionPolicy.RUNTIME)//元注解
   public @interface MyAnnotation{}  
//2、将该注解类作用到类上
   @MyAnnotation
   public class AnnotitionTest1 {
   public static void main(String[] args) {}
   }
//3、对上一类进行反射操作,获取它的注释类对象
   public class AnnotitionTest { 
       public static void main(String[] args) {
        //判断一个类上是否有一个注解类
           if(AnnotitionTest1.class.isAnnotationPresent(MyAnnotation.class)){
            //如果有,则获取这个注解类的对象
               MyAnnotation ma = AnnotitionTest1.class.getAnnotation(MyAnnotation.class);
            //打印该对象。注意:如果此时打印是不会有任何结果的。需要在注解类上加元注解@Retention(RetentionPolicy.RUNTIME)
            System.out.println(ma);
       
    }
}

         2、元注释:注释上的注释。

              上例中为什么要在注释类上加元注释才能打印?这里涉及到一个注释类的生命周期问题。

             1)源文件时期:在源文件上加上注释后,通过编译器进行编译,编译过程中认为注释没用,所以没有编译到class文件中;

             2)class文件时期:当编译到class文件后,类加载器加载该类时,会将该类转换为二进制的字节码,在这个转换过程中,也有可能将注释丢失;

            3)内存中的字节码时期:注释被加载到字节码;

             为了控制注释类的生命周期,java提供了Retention类。

         3、Retention元注释类以及RetentionPolicy枚举类(java.lang.annotation)

            用法:@Retention(@RetentionPolicy.保留周期)

            保留周期: SOURCE  编译器要丢弃的注释。

                           CLASS      编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。//默认周期是CLASS阶段

                             RUNTIME 编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。

               思考:@override,@Suppress Warnings,@Deprecated它们的生命周期都在哪个阶段?(S,S,R)

       4、Target元注释类以及ElementType枚举类。作用:限制该注释类的作用范围;如果没有该注释,则可以作用于任何范围。

            用法:@Target{ElementType.类型}

            类型: CONSTRUCTOR    构造方法声明

                          IELD                     字段声明(包括枚举常量)

                         LOCAL_VARIABLE 局部变量声明

                       METHOD               方法声明

                      PACKAGE              包声明

                      PARAMETER          参数声明

        5、为注释增加基本属性

            1)作用:区分注释

            2)定义和应用属性:在注释类定义:String color(); 后面可以加入默认属性值 default "RED";

               如果属性有默认值,可以省略括弧内的属性,否则,要@MyAnnotation(color = "RED")。

            3)基本属性返回类型可以是原始类型(8个基本数据类型),String类型,Class类型,枚举类型,注解类型,也可以是前面所以类型的数组类型。

 

 

posted @ 2013-04-09 23:58  郭彦君  阅读(231)  评论(0编辑  收藏  举报