zoukankan      html  css  js  c++  java
  • java学习笔记11--Annotation

     java学习笔记11--Annotation

    Annotation:在JDK1.5之后增加的一个新特性,这种特性被称为元数据特性,在JDK1.5之后称为注释,即:使用注释的方式加入一些程序的信息。

    java.lang.annotation Annotation接口是所有的Annotation都必须实现的接口。

    系统内建的Annotation

    在JDK1.5之后,系统中已经建立了如下的三个内建的Annotation类型,用户直接使用即可。

    @Override:覆写的Annotation

    @Deprecated:不赞成使用的Annotation

    @SuppressWarnings:压制安全警告的Annotation

    自定义Annotation

    Annotation定义格式:

    【public】 @interface  Annotation名称{

                 数据类型   变量名称();

    }

    1. public @interface Meaning {  
    2.     String value();  
    3. }  


    之后就直接可以在程序中使用@Meaning的格式

    1. @Meaning(value="itmyhome")  
    2. class Demo{  
    3.       
    4. }  


    可以在Annotation中设置一个参数,用来接收变量的内容,如上面的value,使用Annotation的时候也必须给参数赋值如:value="itmyhome"

    既然可以设置一个参数,则同时也就可以设置多个参数。

    1. public @interface Meaning {  
    2.     String key();  
    3.     String value();  
    4. }  


    此Annotation在使用的时候 需要设置两个参数,一个key一个value

    1. @Meaning(key="hi",value="itmyhome")  
    2. class Demo{  
    3.       
    4. }  


    也可以设置一个数组进去

    1. public @interface Meaning {  
    2.     String[] value();  
    3. }  


    接收的内容要传递数组

    1. @Meaning(value={"hello","world"})  
    2. class Demo{  
    3.       
    4. }  

    以上所定义的全部的Annotation中有一个特点,所有的参数内容需要在使用注释的时候设置上去,那么也可以为一个参数设置默认的内容,在声明的时候使用default即可。

    1. public @interface Meaning {  
    2.     String value() default "";  //默认为空   
    3. }  

    在使用的时候就可以不设置值

    1. @Meaning  
    2. class Demo{  
    3.       
    4. }  


    在操作中,对于一个Annotation而言有时候会固定期取值范围,只能取固定的几个值,这个时候实际上就需要依靠枚举。

    1. public enum FormItemType {  //定义枚举类型  
    2.     hidden,text,select,date  
    3. }  


    定义Annotation

    1. public @interface Meaning {  
    2.     FormItemType value() ;  //设置为枚举类型  
    3. }  


    Annotation的取值只能是枚举类型中的值

    1. @Meaning(value=FormItemType.date)  
    2. class Demo{  
    3.       
    4. }  


    Retention和RetentionPolicy

    在Annotation中,可以使用Retention定义个Annotation的保存范围,此Annotation的定义如下:

    1. @Retention(RetentionPolicy.RUNTIME)  
    2. @Target(ElementType.FIELD)  
    3. public @interface Meaning {  
    4.     FormItemType value() ;  //设置为枚举类型  
    5. }  


    在以上的Retetion定义中存在了一个RetentionPolicy的变量,此变量用于指定Annotation的保存范围,RetentionPolicy包含三种范围

    在三个范围中,最重要的就是RUNTIME范围,因为在执行的时候起作用。

    内建Annotation的RetentionPolicy

    三个内建的Annotation的定义:

    Override定义采用的是@Retention(RetentionPolicy.SOURCE) 只能在源文件中出现

    Deprecated定义采用的是@Retention(RetentionPolicy.RUNTIME),可以在执行时出现

    SuppressWarnings定义采用的是@Retention(RetentionPolicy.SOURCE),只能在源文件中出现

    一个Annotation如果要是想让其变得有意义,则必须结合反射机制取得Annotaion中设置的全部内容。

    在Class类中存在以下几种与Annotation操作有关的方法

    1. package com.itmyhome;  
    2.   
    3. import java.lang.annotation.Annotation;  
    4. import java.lang.reflect.Method;  
    5.   
    6. class Demo{  
    7.     @SuppressWarnings("unchecked")  
    8.     @Deprecated  
    9.     @Override  
    10.     public String toString(){  
    11.         return "hello";  
    12.     }  
    13. }  
    14.   
    15. public class T {  
    16.     public static void main(String[] args) throws Exception{  
    17.         Class<?> c = Class.forName("com.itmyhome.Demo");  
    18.         Method mt = c.getMethod("toString");   //找到toString方法  
    19.         Annotation an[] = mt.getAnnotations(); //取得全部的Annotation  
    20.         for(Annotation a:an){  
    21.             System.out.println(a);  
    22.         }  
    23.           
    24.     }  
    25. }  


    此时已经取得了一个Annota。以上的操作实际上是通过三个系统内建的Annotation完成的,也可以自定义一个Annotation

    1. @Retention(RetentionPolicy.RUNTIME)  
    2. @Target(ElementType.METHOD)  
    3. public @interface Meaning {  
    4.     FormItemType value() ;  //设置为枚举类型  
    5. }  
    1. package com.itmyhome;  
    2.   
    3. import java.lang.reflect.Method;  
    4.   
    5. class Demo{  
    6.     @Meaning(value=FormItemType.select)  //自定义Annotation  
    7.     @SuppressWarnings("unchecked")  
    8.     @Deprecated  
    9.     @Override  
    10.     public String toString(){  
    11.         return "hello";  
    12.     }  
    13. }  
    14.   
    15. public class T {  
    16.     public static void main(String[] args) throws Exception{  
    17.         Class<?> c = Class.forName("com.itmyhome.Demo");  
    18.         Method mt = c.getMethod("toString");   //找到toString方法  
    19.           
    20.         //指定的注释是否存在于此元素上  
    21.         if(mt.isAnnotationPresent(Meaning.class)){  
    22.             Meaning m = mt.getAnnotation(Meaning.class);  //得到指定的Annotation  
    23.             System.out.println(m.value());                //取得Annotation的值  
    24.         }  
    25.           
    26.     }  
    27. }  


     

    @Target

    指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制,如:@Target(ElementType.ANNOTATION_TYPE)

    ElementType的保存范围

  • 相关阅读:
    2011年 CIO简历该怎么写?
    OC内存管理
    【Android游戏开发十五】关于Android 游戏开发中 OnTouchEvent() 触屏事件的性能优化笔记!
    【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!
    ORA16014: 日志 1 的序列号 83 未归档, 没有可用的目的
    【Android游戏开发十四】深入Animation,在SurfaceView中照样使用Android—Tween Animation!
    2011来临 IT人员应该具备哪些技能?
    垃圾控件DatePicker
    【Android游戏开发十八】解放手指,利用传感器开发游戏!(本文讲解在SurfaceView中用重力传感器控制圆球的各方向移动)
    【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
  • 原文地址:https://www.cnblogs.com/timssd/p/4790456.html
Copyright © 2011-2022 走看看