青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統計

最新評論

Java annotation 自定義注釋@interface的用法 --- 轉

一、什么是注釋

    說起注釋,得先提一提什么是元數據(metadata)。所謂元數據就是數據的數據。也就是說,元數據是描述數據的。就象數據表中的字段一樣,每個字段描 述了這個字段下的數據的含義。而J2SE5.0中提供的注釋就是java源代碼的元數據,也就是說注釋是描述java源代碼的。在J2SE5.0中可以自 定義注釋。使用時在@后面跟注釋的名字。
                                                                                   
二、J2SE5.0中預定義的注釋

    在J2SE5.0的java.lang包中預定義了三個注釋。它們是Override、Deprecated和SuppressWarnings。下面分別解釋它們的含義。

       1.Override注釋:僅用于方法(不可用于類、包的生命或其他),指明注釋的方法將覆蓋超類中的方法(如果覆蓋父類的方法而沒有注
釋就無法編譯該類),注釋還能確保注釋父類方法的拼寫是正確(錯誤的編寫,編譯器不認為是子類的新方法,而會報錯)
       2.@Deprecated注釋:對不應再使用的方法進行注釋,與正在聲明為過時的方法放在同一行。使用被     Deprecated注釋的方法,編譯器會
提示方法過時警告(”Warring”)
       3.@SuppressWarnings注釋:單一注釋,可以通過數組提供變量,變量值指明要阻止的特定類型警告(忽略某些警告)。數組中的變量指明要阻 止的警告@SuppressWarnings(value={”unchecked”,”fallthrough”}))

三、自定義注釋@interface

@interface:注釋聲明,定義注釋類型(與默認的Override等三種注釋類型類似)。請看下面實例:

注釋類1:

package a.test;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FirstAnno {
String value() default "FirstAnno";
}

注釋類2:

package a.test;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SecondAnnotation {
//  注釋中含有兩個參數
    String name() default "Hrmzone";
    String url() default "hrmzone.cn";

}

注釋類3:

package a.test;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Kitto {
String value() default "kitto";
}

使用類:

package a.test;
@FirstAnno("http://hrmzone.cn")
public class Anno {
@Kitto("測試")
private String test = "";
//  不賦值注釋中的參數,使用默認參數
    @SecondAnnotation()
    public String getDefault() {
            return "get default Annotation";
    }
    @SecondAnnotation(name="desktophrm",url="desktophrm.com")
    public String getDefine() {
            return "get define Annotation";
    }

}

測試類:

package a.test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class AnnoTest {
public static void main(String[] args) throws ClassNotFoundException {
  // 要使用到反射中的相關內容
  Class c = Class.forName("a.test.Anno");
  Method[] method = c.getMethods();
  boolean flag = c.isAnnotationPresent(FirstAnno.class);
  if (flag) {
   FirstAnno first = (FirstAnno) c.getAnnotation(FirstAnno.class);
   System.out.println("First Annotation:" + first.value() + "\n");
  }

  List<Method> list = new ArrayList<Method>();
  for (int i = 0; i < method.length; i++) {
    list.add(method[i]);
  }

  for (Method m : list) {
   SecondAnnotation anno = m.getAnnotation(SecondAnnotation.class);
   if(anno == null)
    continue;
  
   System.out.println("second annotation's\nname:\t" + anno.name()
     + "\nurl:\t" + anno.url());
  }
 
  List<Field> fieldList = new ArrayList<Field>();
  for(Field f : c.getDeclaredFields()){//訪問所有字段
   Kitto k = f.getAnnotation(Kitto.class);
   System.out.println("----kitto anno: " + k.value());
  }
}

}


結合源文件中注釋,想必對注釋的應用有所了解。下面深入了解。
     深入注釋:
     @Target:指定程序元定義的注釋所使用的地方,它使用了另一個類:ElementType,是一個枚舉類定義了注釋類型可以應用到不同的程序元素以免使用者誤用。看看java.lang.annotation 下的源代碼:

@Documented 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.ANNOTATION_TYPE) 
public @interface Target { 
    ElementType[] value(); 
}


     ElementType是一個枚舉類型,指明注釋可以使用的地方,看看ElementType類:
public enum ElementType { 
     TYPE, // 指定適用點為 class, interface, enum 
     FIELD, // 指定適用點為 field 
     METHOD, // 指定適用點為 method 
     PARAMETER, // 指定適用點為 method 的 parameter 
     CONSTRUCTOR, // 指定適用點為 constructor 
     LOCAL_VARIABLE, // 指定使用點為 局部變量 
     ANNOTATION_TYPE, //指定適用點為 annotation 類型 
     PACKAGE // 指定適用點為 package 
}
     @Retention:這個元注釋和java編譯器處理注釋的注釋類型方式相關,告訴編譯器在處理自定義注釋類型的幾種不同的選擇,需要使用 RetentionPolicy枚舉類。此枚舉類只有一個成員變量,可以不用指明成名名稱而賦值,看Retention的源代碼:

@Documented 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.ANNOTATION_TYPE) 
public @interface Retention { 
    RetentionPolicy value(); 
}
     類中有個RetentionPolicy類,也是一個枚舉類,具體看代碼:

public enum RetentionPolicy { 
     SOURCE, // 編譯器處理完Annotation后不存儲在class中 
     CLASS, // 編譯器把Annotation存儲在class中,這是默認值 
     RUNTIME // 編譯器把Annotation存儲在class中,可以由虛擬機讀取,反射需要 
}
     @Documented:是一個標記注釋,表示注釋應該出現在類的javadoc中,因為在默認情況下注釋時不包括在javadoc中的。

所以如果花費了大量的時間定義一個注釋類型,并想描述注釋類型的作用,可以使用它。

注意他與@Retention(RetentionPolicy.RUNTIME)配合使用,因為只有將注釋保留在編譯后的類文件中由虛擬機加載,

然后javadoc才能將其抽取出來添加至javadoc中。
     @Inherited:將注釋同樣繼承至使用了該注釋類型的方法中(表達有點問題,就是如果一個方法使用了的注釋用了@inherited,

那么其子類的該方法同樣繼承了該注釋)
注意事項:
     1.所有的Annotation自動繼承java.lang.annotation接口
     2.自定義注釋的成員變量訪問類型只能是public、default;(所有的都能訪問,源作者沒用到函數:getDeclaredFields而已)
     3.成員變量的只能使用基本類型(byte、short、int、char、long、double、float、boolean和String、Enum、Class、annotations以及該類型的數據)(沒有限制,大家可以修改測試一下,就清楚)
     4.如果只有一個成員變量,最好將參數名稱設為value,賦值時不用制定名稱而直接賦值
     5.在實際應用中,還可以使用注釋讀取和設置Bean中的變量。

posted on 2013-09-05 18:28 大龍 閱讀(347) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美自拍偷拍| 亚洲欧美日韩中文视频| 亚洲视频在线观看免费| 国产精品99免视看9| 亚洲精品日韩精品| 国产一区激情| 久久综合色88| 欧美a级在线| 亚洲第一主播视频| 欧美日产一区二区三区在线观看 | 你懂的视频欧美| 亚洲精品视频免费| 欧美一区二区免费观在线| 国产亚洲精品7777| 欧美成人国产一区二区| 夜夜嗨av一区二区三区四季av| 亚洲色图综合久久| 国内精品久久久| 你懂的视频一区二区| 欧美精品亚洲精品| 久久精品国产第一区二区三区最新章节| 欧美一区二区三区免费在线看| 国产综合色在线| 欧美精品v日韩精品v国产精品 | 久久精品免费播放| 欧美午夜精品一区| 午夜国产精品视频免费体验区| 亚洲国内高清视频| 国产日韩一区二区三区在线播放| 久久久免费观看视频| 亚洲黄页一区| 亚洲欧洲午夜| 免费久久久一本精品久久区| 日韩一区二区精品葵司在线| 久久国产精品一区二区三区四区| 亚洲精品国产欧美| 国产伦精品一区二区三区高清版 | 亚洲一区久久| 狠狠干成人综合网| 欧美日韩日日骚| 欧美在线三区| 亚洲图片欧美日产| 亚洲国内精品| 亚洲黄色影片| 麻豆精品在线播放| 亚洲欧美中文在线视频| 99精品久久免费看蜜臀剧情介绍| 欧美性猛片xxxx免费看久爱| 欧美日本不卡| 欧美国产一区二区三区激情无套| 久久性色av| 久久xxxx精品视频| 久久精品动漫| 亚洲欧美久久久久一区二区三区| 亚洲午夜精品17c| 日韩午夜电影| 99精品欧美一区二区三区| 亚洲日本在线观看| 久久精品视频免费播放| 亚洲欧洲av一区二区| 亚洲欧美另类在线| 亚洲一区在线观看免费观看电影高清| 国产一区二区主播在线| 国产色婷婷国产综合在线理论片a| 亚洲人成高清| 亚洲人在线视频| 好看的日韩视频| 国产色综合天天综合网| 国产色综合久久| 韩国一区电影| 极品av少妇一区二区| 亚洲动漫精品| 亚洲精选成人| 欧美一区二区三区另类| 一区二区三区日韩精品视频| 国产日韩精品在线| 国内精品美女av在线播放| 国产综合久久久久久鬼色| 欧美日韩亚洲国产精品| 国产精品第13页| 国产精品久久久爽爽爽麻豆色哟哟| 欧美日精品一区视频| 国产精品女人毛片| 国产亚洲在线| 黄色一区二区三区四区| 91久久综合| 日韩视频一区二区| 亚洲一区二区精品在线| 午夜亚洲精品| 亚洲欧美福利一区二区| 欧美在线视频a| 亚洲一区精品在线| 久久艳片www.17c.com| 亚洲电影免费| 蜜桃视频一区| 中文av字幕一区| 久久人体大胆视频| 国产精品久久久久免费a∨大胸| 国产精品一区二区久久| 一区在线视频观看| 最新国产の精品合集bt伙计| 亚洲午夜未删减在线观看| 欧美一区=区| 亚洲国产精品视频一区| 欧美成人精品在线观看| 中文精品99久久国产香蕉| 久久久综合网站| 国产精品一区二区久久| 狠狠色狠狠色综合日日小说| 亚洲天堂av在线免费| 久久这里有精品视频| 一区二区三区视频在线观看| 久久精品国产99国产精品澳门 | 欧美精品麻豆| 国产精品va在线| 亚洲精品日本| 久久婷婷国产麻豆91天堂| 欧美va亚洲va国产综合| 国产精品区二区三区日本| 久久不射2019中文字幕| 欧美揉bbbbb揉bbbbb| 欧美午夜精品一区| 亚洲国产成人tv| 美国十次了思思久久精品导航| 一区二区三区色| 国产精品成人一区二区三区吃奶| 国内精品视频一区| 亚洲欧洲一区| 久久视频在线看| 亚洲三级观看| 免费中文字幕日韩欧美| 亚洲成色777777在线观看影院| 欧美在线观看一区二区| 亚洲一区二区三区中文字幕在线| 欧美日韩国产不卡| 亚洲天堂av高清| 亚洲与欧洲av电影| 国产欧美综合在线| 久久久久久久久久久一区 | 国产日韩欧美高清免费| 在线综合视频| 亚洲在线成人精品| 国产精品日韩久久久久| 久久久久久久一区二区| 久久九九免费| 91久久久久久国产精品| 亚洲日本aⅴ片在线观看香蕉| 欧美揉bbbbb揉bbbbb| 午夜精品福利一区二区三区av| 亚洲视频一二| 欧美色另类天堂2015| 欧美在线一区二区| 性欧美1819sex性高清| 欧美人在线观看| 性欧美video另类hd性玩具| 一区二区三区鲁丝不卡| 国产精品免费一区二区三区在线观看| 亚洲一区二区成人在线观看| 性欧美xxxx大乳国产app| 国内外成人在线| 亚洲高清影视| 国产精品日韩一区| 老司机成人在线视频| 欧美电影免费观看网站| 一本久道久久综合婷婷鲸鱼| 午夜一区在线| 亚洲精品老司机| 亚洲欧美日韩国产一区二区三区| 亚洲大片精品永久免费| 国产精品99久久久久久久久久久久| 狠狠色狠狠色综合系列| 日韩天堂在线观看| 在线精品视频免费观看| 亚洲欧美电影在线观看| 91久久久久久国产精品| 午夜视频一区二区| 在线视频欧美日韩| 国产精品中文字幕在线观看| 亚洲精品一区中文| 一区二区三区在线免费播放| 一级日韩一区在线观看| 国产日韩视频| 玖玖玖国产精品| 欧美久久电影| 久热成人在线视频| 国产精品久久久久久福利一牛影视| 亚洲第一色中文字幕| 国产日韩欧美夫妻视频在线观看| 亚洲承认在线| 国产精品久久久久久久午夜| 亚洲激情另类| 亚洲国产欧美日韩| 欧美一级久久久| 久久av资源网站| 欧美系列电影免费观看| 亚洲伦理在线免费看| 亚洲黄色成人| 美日韩免费视频| 久久综合网络一区二区| 精品盗摄一区二区三区|