Java Annotations

Java Annotations是什么

  • Annontation是Java5開始引入的新特征。中文名稱一般叫注解伯复。它提供了一種安全的類似注釋的機制樱报,用來將任何的信息或元數(shù)據(jù)(metadata)與程序元素(類阵面、方法、成員變量等)進行關(guān)聯(lián)誊涯。
  • 更通俗的意思是為程序的元素(類挡毅、方法、成員變量)加上更直觀更明了的說明暴构,這些說明信息是與程序的業(yè)務(wù)邏輯無關(guān)跪呈,并且是供指定的工具或框架使用的。
  • Annontation像一種修飾符一樣取逾,應(yīng)用于包耗绿、類型、構(gòu)造方法砾隅、方法误阻、成員變量、參數(shù)及本地變量的聲明語句中晴埂。

簡單示例

  • 下面通過一個簡單的例子來看一下Java Annotations 的用法究反。例子里面有兩個Annotations定義,一個使用Annotations的類儒洛。一個解析Annotations的類精耐。

Annotations定義1:一個面向類型的說明

package annoation.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;

/**
 * Created by haicheng.lhc on 04/07/2017.
 *
 * @author haicheng.lhc
 * @date 2017/07/04
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface Description {
    String value();
}

Annotations定義12:一個面向方法的說明

package annoation.test;

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


/**
 * Created by haicheng.lhc on 04/07/2017.
 *
 * @author haicheng.lhc
 * @date 2017/07/04
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface Author {

    String name();
    String group();
}

使用Annotations的類

package annoation.test;

/**
 * Created by haicheng.lhc on 04/07/2017.
 *
 * @author haicheng.lhc
 * @date 2017/07/04
 */
@Description(value = "這是一個有用的類")
public class Utility {
    @Author(name = "haoran_202",group="com.magc")
    public String work() {
        return "work over!";
    }
}

解析Annotations的類

package annoation.test;

import java.lang.reflect.Method;

/**
 * Created by haicheng.lhc on 04/07/2017.
 *
 * @author haicheng.lhc
 * @date 2017/07/04
 */
public class AnalysisAnnotation {

    public static void main(String[] args) {

        try {
            //通過運行時反射API獲得annotation信息
            Class rt_class = Class.forName("annoation.test.Utility");
            Method[] methods = rt_class.getMethods();

            boolean flag = rt_class.isAnnotationPresent(Description.class);

            if (flag) {
                Description description = (Description)rt_class.getAnnotation(Description.class);
                System.out.println("Utility's Description--->" + description.value());
                for (Method method : methods) {
                    if (method.isAnnotationPresent(Author.class)) {
                        Author author = (Author)method.getAnnotation(Author.class);
                        System.out.println("Utility's Author--->" + author.name() + " from " + author.group());

                    }
                }
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }
}

輸出結(jié)果

深入分析

Annotation 組成

每一個Annotation有三部分組成:

  • 1、Annotation.java

定義中的@Interface就代表該類繼承了Annotation

package java.lang.annotation;
public interface Annotation {

    boolean equals(Object obj);

    int hashCode();

    String toString();

    Class<? extends Annotation> annotationType();
}
  • 2琅锻、ElementType.java
package java.lang.annotation;

public enum ElementType {
    TYPE,               /* 類卦停、接口(包括注釋類型)或枚舉聲明  */

    FIELD,              /* 字段聲明(包括枚舉常量)  */

    METHOD,             /* 方法聲明  */

    PARAMETER,          /* 參數(shù)聲明  */

    CONSTRUCTOR,        /* 構(gòu)造方法聲明  */

    LOCAL_VARIABLE,     /* 局部變量聲明  */

    ANNOTATION_TYPE,    /* 注釋類型聲明  */

    PACKAGE             /* 包聲明  */
}
  • 3、RetentionPolicy.java
package java.lang.annotation;
public enum RetentionPolicy {
    SOURCE,            /* Annotation信息僅存在于編譯器處理期間恼蓬,編譯器處理完之后就沒有該Annotation信息了  */

    CLASS,             /* 編譯器將Annotation存儲于類對應(yīng)的.class文件中沫浆。默認行為  */

    RUNTIME            /* 編譯器將Annotation存儲于class文件中,并且可由JVM讀入 */
}

如何定義

  • Annotation類型使用關(guān)鍵字@interface而不是interface滚秩,這個關(guān)鍵字聲明隱含了一個信息:它是繼承了java.lang.annotation.Annotation接口,并非聲明了一個interface

  • Annotation類型淮捆、方法定義是獨特的郁油、受限制的

1本股、Annotation 類型的方法必須聲明為無參數(shù)、無異常拋出的桐腌。
2拄显、這些方法定義了annotation的成員:方法名成為了成員名,而方法返回值成為了成員的類型案站。
3躬审、而方法返回值類型必須為primitive類型、Class類型蟆盐、枚舉類型承边、annotation類型或者由前面類型之一作為元素的一維數(shù)組。
4、方法的后面可以使用 default和一個默認數(shù)值來聲明成員的默認值,null不能作為成員默認值任连,這與我們在非annotation類型中定義方法有很大不同拨黔。
5、Annotation類型和它的方法不能使用annotation類型的參數(shù)呛哟、成員不能是generic。
6、只有返回值類型是Class的方法可以在annotation類型中使用generic窖式,因為此方法能夠用類轉(zhuǎn)換將各種類型轉(zhuǎn)換為Class。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末动壤,一起剝皮案震驚了整個濱河市萝喘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狼电,老刑警劉巖蜒灰,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肩碟,居然都是意外死亡强窖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門削祈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翅溺,“玉大人,你說我怎么就攤上這事髓抑×椋” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵吨拍,是天一觀的道長褪猛。 經(jīng)常有香客問我,道長羹饰,這世上最難降的妖魔是什么伊滋? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任碳却,我火速辦了婚禮,結(jié)果婚禮上笑旺,老公的妹妹穿的比我還像新娘昼浦。我一直安慰自己,他們只是感情好筒主,可當(dāng)我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布关噪。 她就那樣靜靜地躺著,像睡著了一般乌妙。 火紅的嫁衣襯著肌膚如雪使兔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天冠胯,我揣著相機與錄音火诸,去河邊找鬼。 笑死荠察,一個胖子當(dāng)著我的面吹牛置蜀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悉盆,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼盯荤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了焕盟?” 一聲冷哼從身側(cè)響起秋秤,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脚翘,沒想到半個月后灼卢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡来农,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年鞋真,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沃于。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡涩咖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出繁莹,到底是詐尸還是另有隱情檩互,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布咨演,位于F島的核電站闸昨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜饵较,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一溉跃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧告抄,春花似錦、人聲如沸嵌牺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逆粹。三九已至募疮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間僻弹,已是汗流浹背阿浓。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蹋绽,地道東北人芭毙。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像卸耘,于是被迫代替她去往敵國和親退敦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,652評論 2 354

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

  • 什么是注解(Annotation):Annotation(注解)就是Java提供了一種元程序中的元素關(guān)聯(lián)任何信息和...
    九尾喵的薛定諤閱讀 3,163評論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理蚣抗,服務(wù)發(fā)現(xiàn)侈百,斷路器,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 對象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法翰铡,而不是構(gòu)造函數(shù)創(chuàng)建對象:僅僅是創(chuàng)建對象的方法钝域,并非Fa...
    孫小磊閱讀 1,981評論 0 3
  • 本文章涉及代碼已放到github上annotation-study 1.Annotation為何而來 What:A...
    zlcook閱讀 29,158評論 15 116
  • 每當(dāng)我告訴別人我住在城中村的時候,別人先是很詫異锭魔,然后再是“哦”的一聲岔開話題例证,我明白那一聲“哦”的意思,就是說你...
    林木森深深閱讀 844評論 0 50