java 高新技术【8】 注解

注解Annotation
    JDK1.5出现的新特性。在java.lang.annotation包中。

    对于过时的语句,java会提示过时了,通过@SuppressWarnings("Deprecation")在DOS中取消提示,但Eclipse无法取消。

这就是注解,相当于标记。编译器、开发工具、javac通过反射获得注解里的内容,进而明确应该做什么、不应该做什么。注解可以加在包、类、属性、方法、参数及局部变量之上。

    一个注解就是一个类。@SuppressWarnings,取消警告。@Deprecated,已过时,老版可以用,新版无法用。


    HashSet集合中,对象必须覆盖Object类的equals()方法,否则会继续使用Object类的equals()方法进行比较,错误的比较方法。覆盖equals()方法,参数必须一致,为了防止错误写入本类的对象,加入@Override,必须正确覆盖父类方法,不是创建新方法。
   
    注解的应用
    在源程序中,调用一个类,这个类会用到注解,需要先准备好注解类,类在调用注解类的对象。注解类的写法类似接口,@interface。先写好注解类A,将注解放在类B中,类C在调用类B时通过反射获得注解类A的内容,进而明确该做什么、不该做什么。可以加上多个注解,加上的实际是注解类的对象:@interfaceA。
    main()方法必须放在一个类下,但与这个类不一定有所属关系。
    在注解类A上加注解B,这个注解B只为这个注解类A服务,B称为“元注解”。类似的还有元信息、元数据。元注解有2个:Rentention和Target。对注解类的注解,可以理解为注解类的属性。
   
 
   (1) Rentention注解类

    注解的生命周期:Java源文件—》class文件—》内存中的字节码。编译或者运行时,都有可能会取消注解。Rentention的3种取值意味让注解保留到哪个阶段,RententionPolicy.SOURCE、RententionPolicy.CLASS(默认值)、RententionPolicy.RUNTIME。


    @Override、@SuppressWarnings是默认保留到SOURCE阶段;

@Deprecated是保留到RUNTIME阶段。


    Rentention相当于注解类的一个属性,因为Rentention的值不同,注解类保留到的阶段不同。注解类内部Rentention的值使用value表示,例如,@Deprecated中,value=Runtime。
    Rentention的值是枚举RententionPolicy的值,只有3个:SOURCE、CLASS、RUNTIME。
 
    (2)Target注解类

    性质和Rentention一样,都是注解类的属性,表示注解类应该在什么位置,对那一块的数据有效。例如,@Target(ElementType.METHOD)


Target内部的值使用枚举ElementType表示,表示的主要位置有:注解、构造方法、属性、局部变量、函数、包、参数和类(默认值)。多个位置使用数组,例如,@Target({ElementType.METHOD,ElementType.TYPE})。
类、接口、枚举、注解这一类事物用TYPE表示,Class的父类,JDK1.5的新特性。
 
注解的基本属性
属性,给注解提供更加详细的信息。
注解相当于接口,属性相当于方法。例如,@ItcastAnnotation(color="red"),给属性赋值,取值时类似调用方法,例如,System.out.println(annotation.color());。


所有的属性必须全部出现,除非有缺省值。


如果只有value属性,没有其他属性,可以不写=,只针对value,例如,@SuppressWarnings("Deprecation")。或者有其他属性而且有缺省值,
例如,String color() default "blue";,此时value单独出现,不用=。



获得注解的属性的值,例如
if(AnnotationDemo.class.isAnnotationPresent(ItmAnnotation.class)){
        ItmAnnotation annotation =
              (ItmAnnotation)AnnotationDemo.class.getAnnotation(ItmAnnotation.class);
        System.out.println(annotation.color());
        }
}
利用反射获得注解的对象,在让该对象调用属性对应的方法。注意类型转换。


Rentention和Target也是属性,都是value对应的值,值的类型分别是RententionPolicy和ElementType,例如,@Retention(value=RetentionPolicy.RUNTIME)。




 
注解的高级属性

给注解增加高级属性,数组、枚举、注解。


【1】数组类型的属性

例如,int[] arr() default {3,7,5};,MyAnnotation(arr={3,7,6})。如果数组只有1个元素,可以不加{}。

@Target({ElementType.METHOD,ElementType.TYPE})也是数组类型的属性。

枚举类型的属性


//注解类内部的内容
EnumerationDemo.TrafficLamp lamp() default EnumerationDemo.TrafficLamp.RED;
//调用注解的类上
@ItcastAnnotation(lamp=EnumerationDemo.TrafficLamp.YELLOW)
//对注解进行操作

System.out.println(annotation.lamp().nextLamp().name());


注解类型的属性
将一个注解类作为属性加入到另一个注解类中。

MetaAnnotation annotationAtt() default @MetaAnnotation("Jobs")
@ItcastAnnotation(annotationAtt=@MetaAnnotation("Kim"))
annotation.annotationAtt().value()
注解的返回值可以是8个基本类型、String、Class、枚举以及前面类型的数组,内部还有属性。

需要详细学习注解,可以通过java语言规范,即languagespecification。


[java]  view plain copy print ?
  1. <span style="font-size:18px;">import java.lang.annotation.ElementType;  
  2. import java.lang.annotation.Retention;  
  3. import java.lang.annotation.RetentionPolicy;  
  4. import java.lang.annotation.Target;  
  5.   
  6. import com.java.testDay.EnumTest;  
  7.   
  8. //下面這個注解  視為 這個 ItmAnnotation 注解 服務的。  
  9. @Retention(RetentionPolicy.RUNTIME)  
  10.   
  11. @Target({ElementType.METHOD,ElementType.TYPE})  
  12. public @interface ItmAnnotation {  
  13.     String color() default "blue";  
  14.     String value();  
  15.     int[] arrayAttr() default{3,4,4};  
  16.       
  17.     // 枚举  的   注解。EnumTest.TrafficLamp.RED----这是枚举的实例对象。  
  18.     EnumTest.TrafficLamp  lamp()  default EnumTest.TrafficLamp.RED;  
  19.       
  20.     MetaAnnotation annotationAttr() default @MetaAnnotation("lhm");  
  21. }  
  22. </span>  

[java]  view plain copy print ?
  1. <span style="font-size:18px;">package com.java.testDay;  
  2. import java.util.Date;  
  3.   
  4.   
  5. public class EnumTest {  
  6.   
  7.     /** 
  8.      * @param args 
  9.      */  
  10.     public static void main(String[] args) {  
  11.         // TODO Auto-generated method stub  
  12.         WeekDay1 weekDay = WeekDay1.MON;  
  13.         System.out.println(weekDay.nextDay());  
  14.           
  15.         WeekDay weekDay2 = WeekDay.FRI;  
  16.         System.out.println(weekDay2);  
  17.         System.out.println(weekDay2.name());  
  18.         System.out.println(weekDay2.ordinal());   
  19.         System.out.println(WeekDay.valueOf("SUN").toString());  
  20.         System.out.println(WeekDay.values().length);  
  21.           
  22.         new Date(300){};  
  23.     }  
  24.   
  25.     public enum WeekDay{  
  26.   
  27.         SUN(1),MON(),TUE,WED,THI,FRI,SAT;  
  28.         private WeekDay(){System.out.println("first");}  
  29.         private WeekDay(int day){System.out.println("second");}  
  30.     }  
  31.       
  32.     public enum TrafficLamp{  
  33.         RED(30){  
  34.             public  TrafficLamp nextLamp(){  
  35.                 return GREEN;  
  36.             }  
  37.         },  
  38.         GREEN(45){  
  39.             public  TrafficLamp nextLamp(){  
  40.                 return YELLOW;  
  41.             }             
  42.         },  
  43.         YELLOW(5){  
  44.             public  TrafficLamp nextLamp(){  
  45.                 return RED;  
  46.             }             
  47.         };  
  48.         public abstract TrafficLamp nextLamp();  
  49.         private int time;  
  50.         private TrafficLamp(int time){this.time = time;}  
  51.     }  
  52. }  
  53. </span>  

[java]  view plain copy print ?
  1. <span style="font-size:18px;">package com.java.test;  
  2.   
  3.   
  4.   
  5. public @interface MetaAnnotation {  
  6.     String value();  
  7. }  
  8. </span>  

[java]  view plain copy print ?
  1. <span style="font-size:18px;">package com.java.test;  
  2.   
  3. // 注解 就相當於 一個牌子。  
  4. @ItmAnnotation(annotationAttr=@MetaAnnotation("hhh"),color="red",value="abc",arrayAttr={1,2,3})// 我只写 color会报错,是不是 类似接口啊,  
  5. // annotationAttr=@MetaAnnotation("hhh") 注解的属性值  又是一个注解。。。。  
  6.   
  7. // 若数组只有一个值:可以写成这样:arrayAttr=1  
  8.   
  9. // 如果只有 一个 value属性需要你设值,就不写 “value=” 了。也就是 直接写值就可以了,如果不这样的话,也可以把别的属性  设置为 默认的。  
  10. public class AnnotationTest {  
  11.   
  12.     /** 
  13.      * @param args 
  14.      */  
  15.     @SuppressWarnings("deprecation")  
  16.     @ItmAnnotation("xyz"// 必须把其他的属性  改为 默认的。。  
  17.     public static void main(String[] args) throws Exception{  
  18.             System.runFinalizersOnExit(true);  
  19.             // 檢查 ItmAnnotation.class 在不在。    
  20.             // 这里主要 应用了 反射的知识,来检查以及得到  要操作的类。也就是  你自己要用的  东西,你想要用什么  就去拿什么。  
  21.             if (AnnotationTest.class.isAnnotationPresent(ItmAnnotation.class)) {  
  22.                    // 如果在的話  就得到 這個注解。  
  23.                     ItmAnnotation annotation =AnnotationTest.class.getAnnotation(ItmAnnotation.class);   
  24.                     System.out.println("得到,ItmAnnotation :" + annotation);  
  25.                     System.out.println("\n");  
  26.                     // 这时,你就可以用到   ItmAnnotation 里面的 color属性了。再用之前   必须在类名上 加上标示。  
  27.                     // 也就是说:你想要用什么,可以让你用,但是 你必须  要告诉一声,要立个牌坊,哈哈。  
  28.                     System.out.println(annotation.color());  
  29.                       
  30.                     System.out.println(annotation.value());  
  31.                       
  32.                     System.out.println(annotation.arrayAttr().length);  
  33.                       
  34.                     // 枚举:  
  35.                     System.out.println(annotation.lamp().nextLamp().name());  
  36.                       
  37.                     // 注解的注解:  
  38.                     System.out  
  39.                             .println(annotation.annotationAttr().value());  
  40.                       
  41.                       
  42.             }  
  43.     }  
  44.   
  45.     @Deprecated  
  46.     public static void sayHello(){  
  47.         System.out.println("hi,哈哈哈");  
  48.     }  
  49. }  
  50. </span>  

还有一个 不错的例子:

http://www.iteye.com/topic/400085

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值