注解(Annotation):注解處理器

轉(zhuǎn)載自:http://www.cnblogs.com/peida/archive/2013/04/26/3038503.html

如果沒有用來讀取注解的方法和工作,那么注解也就不會(huì)比注釋更有用處了狈定。使用注解的過程中谨设,很重要的一部分就是創(chuàng)建于使用注解處理器掠廓。Java SE5擴(kuò)展了反射機(jī)制的API婆瓜,以幫助程序員快速的構(gòu)造自定義注解處理器啄糙。


注解處理器類庫(java.lang.reflect.AnnotatedElement):

Java使用Annotation接口來代表程序元素前面的注解放刨,該接口是所有Annotation類型的父接口工秩。除此之外,Java在java.lang.reflect 包下新增了AnnotatedElement接口进统,該接口代表程序中可以接受注解的程序元素助币,該接口主要有如下幾個(gè)實(shí)現(xiàn)類:

  1. Class:類定義
  2. Constructor:構(gòu)造器定義
  3. Field:累的成員變量定義
  4. Method:類的方法定義
  5. Package:類的包定義

java.lang.reflect 包下主要包含一些實(shí)現(xiàn)反射功能的工具類,實(shí)際上螟碎,java.lang.reflect 包所有提供的反射API擴(kuò)充了讀取運(yùn)行時(shí)Annotation信息的能力眉菱。當(dāng)一個(gè)Annotation類型被定義為運(yùn)行時(shí)的Annotation后,該注解才能是運(yùn)行時(shí)可見掉分,當(dāng)class文件被裝載時(shí)被保存在class文件中的Annotation才會(huì)被虛擬機(jī)讀取俭缓。  
AnnotatedElement 接口是所有程序元素(Class酥郭、Method和Constructor)的父接口华坦,所以程序通過反射獲取了某個(gè)類的AnnotatedElement對(duì)象之后,程序就可以調(diào)用該對(duì)象的如下四個(gè)個(gè)方法來訪問Annotation信息:

  1. <T extends Annotation> T getAnnotation(Class<T> annotationClass): 返回改程序元素上存在的不从、指定類型的注解惜姐,如果該類型注解不存在,則返回null消返。
  2. Annotation[] getAnnotations():返回該程序元素上存在的所有注解载弄。
  3. boolean is AnnotationPresent(Class<?extends Annotation> annotationClass):判斷該程序元素上是否包含指定類型的注解,存在則返回true撵颊,否則返回false.
  4. Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注釋宇攻。與此接口中的其他方法不同,該方法將忽略繼承的注釋倡勇。(如果沒有注釋直接存在于此元素上逞刷,則返回長度為零的一個(gè)數(shù)組。)該方法的調(diào)用者可以隨意修改返回的數(shù)組妻熊;這不會(huì)對(duì)其他調(diào)用者返回的數(shù)組產(chǎn)生任何影響夸浅。

一個(gè)簡單的注解處理器:

/***********注解聲明***************/

/**
 * 水果名稱注解
 * @author peida
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitName {
    String value() default "";
}

/**
 * 水果顏色注解
 * @author peida
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitColor {
    /**
     * 顏色枚舉
     * @author peida
     *
     */
    public enum Color{ BULE,RED,GREEN};

    /**
     * 顏色屬性
     * @return
     */
    Color fruitColor() default Color.GREEN;

}

/**
 * 水果供應(yīng)者注解
 * @author peida
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitProvider {
    /**
     * 供應(yīng)商編號(hào)
     * @return
     */
    public int id() default -1;

    /**
     * 供應(yīng)商名稱
     * @return
     */
    public String name() default "";

    /**
     * 供應(yīng)商地址
     * @return
     */
    public String address() default "";
}

/***********注解使用***************/

public class Apple {

    @FruitName("Apple")
    private String appleName;

    @FruitColor(fruitColor=Color.RED)
    private String appleColor;

    @FruitProvider(id=1,name="陜西紅富士集團(tuán)",address="陜西省西安市延安路89號(hào)紅富士大廈")
    private String appleProvider;

    public void setAppleColor(String appleColor) {
        this.appleColor = appleColor;
    }
    public String getAppleColor() {
        return appleColor;
    }

    public void setAppleName(String appleName) {
        this.appleName = appleName;
    }
    public String getAppleName() {
        return appleName;
    }

    public void setAppleProvider(String appleProvider) {
        this.appleProvider = appleProvider;
    }
    public String getAppleProvider() {
        return appleProvider;
    }

    public void displayName(){
        System.out.println("水果的名字是:蘋果");
    }
}

/***********注解處理器***************/

public class FruitInfoUtil {
    public static void getFruitInfo(Class<?> clazz){

        String strFruitName=" 水果名稱:";
        String strFruitColor=" 水果顏色:";
        String strFruitProvicer="供應(yīng)商信息:";

        Field[] fields = clazz.getDeclaredFields();

        for(Field field :fields){
            if(field.isAnnotationPresent(FruitName.class)){
                FruitName fruitName = (FruitName) field.getAnnotation(FruitName.class);
                strFruitName=strFruitName+fruitName.value();
                System.out.println(strFruitName);
            }
            else if(field.isAnnotationPresent(FruitColor.class)){
                FruitColor fruitColor= (FruitColor) field.getAnnotation(FruitColor.class);
                strFruitColor=strFruitColor+fruitColor.fruitColor().toString();
                System.out.println(strFruitColor);
            }
            else if(field.isAnnotationPresent(FruitProvider.class)){
                FruitProvider fruitProvider= (FruitProvider) field.getAnnotation(FruitProvider.class);
                strFruitProvicer=" 供應(yīng)商編號(hào):"+fruitProvider.id()+" 供應(yīng)商名稱:"+fruitProvider.name()+" 供應(yīng)商地址:"+fruitProvider.address();
                System.out.println(strFruitProvicer);
            }
        }
    }
}

/***********輸出結(jié)果***************/
public class FruitRun {

    /**
     * @param args
     */
    public static void main(String[] args) {

        FruitInfoUtil.getFruitInfo(Apple.class);

    }

}

輸出結(jié)果:

水果名稱:Apple 
水果顏色:RED 
供應(yīng)商編號(hào):1 供應(yīng)商名稱:陜西紅富士集團(tuán) 供應(yīng)商地址:陜西省西安市延安路89號(hào)紅富士大廈

Java注解的基礎(chǔ)知識(shí)點(diǎn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市扔役,隨后出現(xiàn)的幾起案子帆喇,更是在濱河造成了極大的恐慌,老刑警劉巖亿胸,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坯钦,死亡現(xiàn)場離奇詭異预皇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)婉刀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門吟温,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人突颊,你說我怎么就攤上這事鲁豪。” “怎么了律秃?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵爬橡,是天一觀的道長。 經(jīng)常有香客問我友绝,道長堤尾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任迁客,我火速辦了婚禮郭宝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掷漱。我一直安慰自己粘室,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布卜范。 她就那樣靜靜地躺著衔统,像睡著了一般。 火紅的嫁衣襯著肌膚如雪海雪。 梳的紋絲不亂的頭發(fā)上锦爵,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音奥裸,去河邊找鬼险掀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛湾宙,可吹牛的內(nèi)容都是我干的樟氢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼侠鳄,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼埠啃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起伟恶,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤碴开,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后博秫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叹螟,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鹃骂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年台盯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了罢绽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡静盅,死狀恐怖良价,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蒿叠,我是刑警寧澤明垢,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站市咽,受9級(jí)特大地震影響痊银,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜施绎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一溯革、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谷醉,春花似錦致稀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至遇八,卻和暖如春矛绘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背刃永。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工货矮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人揽碘。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓次屠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親雳刺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子劫灶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容