16--黑马程序员--基础加强之注解

----------------------ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

一.注解基础知识点

          1.概念
        注解:也叫注释,也叫元数据。一种代码级别的说明。它是是JDK5.0及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)。
        2.作用
        注解有三个作用:
        1)编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
        2)代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
        3)编译检查:通过代码里标识的元数据让编译器能过实现基本的编译检查【Override】
        3.注解所在包
        包 java.lang 中包含所有定义自定义注解所需用到的原注解和接口。如接口 java.lang.annotation.Annotation 是所有注解继承的接口,并且是自动继承,不需要定义时指定,类似于所有类都自动继承Object。

        该包同时定义了三个元注SuppressWarnings,Deprecated,Override。下面将在实例中逐个讲解他们的作用,及使用方法。

二.元注解详解

           1.SuppressWarnings
        简介:java.lang.SuppressWarnings是J2SE 5.0中标准的Annotation之一。可以标注在类、字段、方法、参数、构造方法,以及局部变量上。
        作用:告诉编译器忽略指定的警告,不用在编译完成后出现警告信息。
        使用:
        @SuppressWarnings("")
        @SuppressWarnings({})
        @SuppressWarnings(value={})
         根据sun的官方文档描述:
         将由编译器在注释的元素中取消显示的警告集。允许使用重复的名称。忽略第二个和后面出现的名称。出现未被识别的警告名不是 错误:编译器必须忽略无法识别的所有警告名。但如果某个注释包含未被识别的警告名,那么编译器可以随意发出一个警告。
各编译器供应商应该将它们所支持的警告名连同注释类型一起记录。鼓励各供应商之间相互合作,确保在多个编译器中使用相同的名称。

             我们可以看到,当用Myeclipse调用一个过时的方法时,它会自动在那个方法名上划一道横线,提示编程人员这是一个过时的方法,建议不要再调用它。而在cmd调试此程序也会有响应的提示:

             这个时候我们要是在在main方法上添加一个注解:@SuppressWarnings("deprecation"),此注解的作用就是告诉编译器,虽然我用的方法过时了,但是我还是坚持要用,你就不要再提示了。

        虽然Myeclipse编译器依然有横线,但在cmd调试时,就不会有相关的过时提示了。

         2.Deprecated
       作用:用 @Deprecated注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告。 
       其次,请注意标题,这两个标记有大小写之分,一个是D,一个是d。
       源代码标记@Deprecated是在JDK1.5中作为内置的annotation引入的,用于表明类(class)、方法(method)、字段(field)已经不再推荐使用,并且在以后的JDK版本中可能将其删除,编译器在默认情况下检测到有此标记的时候会提示警告信息。

       Java注释中的@deprecated用于在用Javadoc工具生成文档的时候,标注此类/接口、方法、字段已经被废止。不过后者还有一个功能就是和源代码标记@Deprecated同样的功能,在JDK1.4版本之后,该功能被@Deprecated所取代。

代码示例:

       3.Override
       简介:@Override是伪代码,表示重写。有时我们需要覆盖父类的方法,但是可能方法名或者参数会出现不小心写错的情况。这时候就可以为这个方法打上@Override注解,如果有任何差错,eclipse就会报错。
       作用:
       1)可以当注释用,方便阅读;
       2)编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错。比如你如果没写@Override而你下面的方法名又写错了,这时你的编译器是可以通过的(它以为这个方法是你的子类中自己增加的方法)。

       sun公司的官方解释:表示一个方法声明打算重写超类中的另一个方法声明。如果方法利用此注释类型进行注解但没有重写超类方法,则编译器会生成一条错误消息。

代码示例:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class OverrideDemo {  
  2.   
  3.     /**Override注解的应用  
  4.      * @黑马ZWF  
  5.      */  
  6.     public static void main(String[] args) {  
  7.         // TODO Auto-generated method stub  
  8.          Checket c = new Checket();    
  9.          c.foo();    
  10.     }  
  11. }  
  12. class Base {                      //父类  
  13.     public Base(){    
  14.         System.out.println("Base");    
  15.     }         
  16.     public void foo(){                        //父类定义方法  
  17.         System.out.println("foo in father");    
  18.     }    
  19. }    
  20. class Checket extends Base {    
  21.     public Checket(){    
  22.         super();    
  23.         System.out.println("Checket");    
  24.     }         
  25.     @Override     
  26.     public void foo(){           //子类复写父类方法  
  27.         System.out.println("foo in son");     
  28.     }    
  29. }   
              这个例子中,子类Checketfoo函数覆写了父类Base中的foo方法,而@Override 关键字(我就把它理解成了关键字)的作用在于,告诉编译器,如果foo这个方法存在于父类中,那么编译通过,如果在父类中不存在,那么就会报错:

           三.注解的反射调用

           注解是一个特殊的类,关键字不是class。而是@interface。它相当于一个你的源程序中要调用的一个类,要在源程序中应用某个注解,得先准备好了这个注解类。就像你要调用某个类,得先有开发好这个类。

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. @WfAnnotation    
  2. class AnnotationDemo3 {    
  3.     /**  
  4.      * 注解的反射调用  
  5.      * @黑马ZWF  
  6.      */  
  7.     public static void main(String[] args) {    
  8.         if(AnnotationDemo3.class.isAnnotationPresent(WfAnnotation.class)){    
  9.             WfAnnotation annotation = (WfAnnotation)AnnotationDemo3.class.getAnnotation(WfAnnotation.class);    
  10.             System.out.println(annotation );    //输出结果@注解.WfAnnotation()  
  11.   
  12.         }    
  13.     }    
  14. }      
  15. @Retention(RetentionPolicy.RUNTIME)    
  16.  @interface WfAnnotation {    
  17.     
  18. }    
        这里注意,注解的三个生命周期:source,class,内存里的二进制码
        编译器在进行将source转换为class和将class转换为内存里的二进制编码的时候都有可能将注解去掉。
        因此要在上面的注解上头上再加注解:RententionPolicy.RUNTIME表示注解生命周期一直到运行期。也就是内存里的二进制码
四.为注解增加各种属性
       1.什么是注解的属性
      一个注解相当于一个胸牌,如果你胸前贴了胸牌,就是黑马的学生,否则,就不是。如果还想区分出是黑马哪个班的学生,这时候可以为胸牌再增加一个属性来进行区分。
加了属性的标记效果为:@MyAnnotation(color="red")。
      2.定义基本类型的属性和应用属性:
      在注解类中增加String color(); 被添加的注解设置属性值:@MyAnnotation(color="red")。
      用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法
      MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
      System.out.println(a.color());
      可以认为上面这个@MyAnnotation是MyAnnotaion类的一个实例对象。
      3.为属性指定缺省值:
      String color() default "yellow";
      value属性:String value() default "zxx";
      如果注解中有一个名称为value的属性,且你只想设置value属性(即其他属性都采用默认值或者你只有一个value属性),那么可以省略value=部分,例如:@MyAnnotation("lhm")。
      4.数组类型的属性
      int [] arrayAttr() default {1,2,3}; 
被添加的注解设置属性值:@MyAnnotation(arrayAttr={2,3,4})。
       如果数组属性中只有一个元素,这时候属性值部分可以省略大括号。
      5.枚举类型的属性
      EnumTest.TrafficLamp lamp() ; 
被添加的注解设置属性值:@MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)。
      6.注解类型的属性:
      MetaAnnotation annotationAttr() default @MetaAnnotation("xxxx"); 被添加的注解设置属性值:      @MyAnnotation(annotationAttr=@MetaAnnotation(“yyy”) )
       可以认为上面这个@MyAnnotation是MyAnnotaion类的一个实例对象,同样的道理,可以认为上面这个@MetaAnnotation是           MetaAnnotation类的一个实例对象,调用代码如下:
       MetaAnnotation ma =  myAnnotation.annotationAttr();
       System.out.println(ma.value());
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值