Java反射 - 注解

使用Java反射虚吟,您可以在運(yùn)行時(shí)訪問附加到Java類的注解御蒲。

什么是Java注釋掘剪?

注釋是Java 5中的一項(xiàng)新功能腻格。注釋是一種可以在Java代碼中插入的注釋或元數(shù)據(jù)画拾。 這些注釋可以在編譯時(shí)通過預(yù)編譯工具進(jìn)行處理,也可以在運(yùn)行時(shí)通過Java Reflection進(jìn)行處理菜职。 這是一個(gè)類注釋的例子:

@MyAnnotation(name="someName",  value = "Hello World")
public class TheClass {
}

類TheClass的注釋@MyAnnotation寫在自己類上青抛。 注釋被定義為接口。 這是MyAnnotation定義:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)

public @interface MyAnnotation {
    public String name();
    public String value();
}

前面的@標(biāo)記為注釋酬核。 一旦定義了注釋蜜另,就可以在代碼中使用它,如前面的示例所示嫡意。

注解定義中的兩條指令@Retention(RetentionPolicy.RUNTIME)和@Target(ElementType.TYPE)指定了注釋的使用方式举瑰。

@Retention(RetentionPolicy.RUNTIME)意味著注釋可以在運(yùn)行時(shí)通過反射來訪問。 如果你沒有設(shè)置這個(gè)指令蔬螟,注釋將不會(huì)在運(yùn)行時(shí)被保留下來此迅,因此不能通過反射來獲得。

@Target(ElementType.TYPE)意味著注釋只能在類型(通常是類和接口)的類上使用。 您也可以指定METHOD或FIELD邮屁,或者可以將目標(biāo)放在一起整袁,以便注釋可以用于類,方法和字段佑吝。

類注解

您可以在運(yùn)行時(shí)訪問類坐昙,方法或字段的注釋。 以下是訪問類注釋的示例:

Class aClass = TheClass.class;
Annotation[] annotations = aClass.getAnnotations();

for(Annotation annotation : annotations){
    if(annotation instanceof MyAnnotation){
        MyAnnotation myAnnotation = (MyAnnotation) annotation;
        System.out.println("name: " + myAnnotation.name());
        System.out.println("value: " + myAnnotation.value());
    }
}

您也可以像這樣訪問特定的類注解:

Class aClass = TheClass.class;
Annotation annotation = aClass.getAnnotation(MyAnnotation.class);

if(annotation instanceof MyAnnotation){
    MyAnnotation myAnnotation = (MyAnnotation) annotation;
    System.out.println("name: " + myAnnotation.name());
    System.out.println("value: " + myAnnotation.value());
}

方法注解

以下是帶注解的方法的示例:

public class TheClass {
  @MyAnnotation(name="someName",  value = "Hello World")
  public void doSomething(){}
}

您可以像這樣訪問方法注釋:

Method method = ... //obtain method object
Annotation[] annotations = method.getDeclaredAnnotations();

for(Annotation annotation : annotations){
    if(annotation instanceof MyAnnotation){
        MyAnnotation myAnnotation = (MyAnnotation) annotation;
        System.out.println("name: " + myAnnotation.name());
        System.out.println("value: " + myAnnotation.value());
    }
}

您也可以像這樣訪問特定的方法注釋:

Method method = ... // obtain method object
Annotation annotation = method.getAnnotation(MyAnnotation.class);

if(annotation instanceof MyAnnotation){
    MyAnnotation myAnnotation = (MyAnnotation) annotation;
    System.out.println("name: " + myAnnotation.name());
    System.out.println("value: " + myAnnotation.value());
}

參數(shù)注釋

也可以為方法參數(shù)聲明添加注釋芋忿。

public class TheClass {
  public static void doSomethingElse(
        @MyAnnotation(name="aName", value="aValue") String parameter){
  }
}

您可以像這樣訪問Method對(duì)象的參數(shù)注釋:

Method method = ... //obtain method object
Annotation[][] parameterAnnotations = method.getParameterAnnotations();
Class[] parameterTypes = method.getParameterTypes();

int i=0;
for(Annotation[] annotations : parameterAnnotations){
  Class parameterType = parameterTypes[i++];

  for(Annotation annotation : annotations){
    if(annotation instanceof MyAnnotation){
        MyAnnotation myAnnotation = (MyAnnotation) annotation;
        System.out.println("param: " + parameterType.getName());
        System.out.println("name : " + myAnnotation.name());
        System.out.println("value: " + myAnnotation.value());
    }
  }
}

請(qǐng)注意Method.getParameterAnnotations()方法如何返回一個(gè)二維Annotation數(shù)組炸客,其中包含每個(gè)方法參數(shù)的注釋數(shù)組。

字段注解

以下是帶注釋的字段示例:

public class TheClass {

  @MyAnnotation(name="someName",  value = "Hello World")
  public String myField = null;
}

您可以像這樣訪問字段注釋:

Field field = ... //obtain field object
Annotation[] annotations = field.getDeclaredAnnotations();

for(Annotation annotation : annotations){
    if(annotation instanceof MyAnnotation){
        MyAnnotation myAnnotation = (MyAnnotation) annotation;
        System.out.println("name: " + myAnnotation.name());
        System.out.println("value: " + myAnnotation.value());
    }
}

您也可以像這樣訪問特定的字段注釋:

Field field = ... // obtain method object
Annotation annotation = field.getAnnotation(MyAnnotation.class);

if(annotation instanceof MyAnnotation){
    MyAnnotation myAnnotation = (MyAnnotation) annotation;
    System.out.println("name: " + myAnnotation.name());
    System.out.println("value: " + myAnnotation.value());
}

實(shí)戰(zhàn)

package com.reflection.detail;

import java.lang.annotation.Annotation;

/**
 * Created by Fant.J.
 * 2018/2/7 16:13
 */
public class Reflection_Annotations {
    public static void main(String[] args) {

        //獲取對(duì)象
        Class aClass = People.class;
        Annotation[] annotations = aClass.getAnnotations();

        //獲取類注解
        for(Annotation annotation : annotations){
            if(annotation instanceof MyAnnotation){
                MyAnnotation myAnnotation = (MyAnnotation) annotation;
                System.out.println("name: " + myAnnotation.name());
                System.out.println("value: " + myAnnotation.value());
            }
        }


    }
}

name: someName
value: Hello World

項(xiàng)目代碼:github鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末戈钢,一起剝皮案震驚了整個(gè)濱河市痹仙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌殉了,老刑警劉巖开仰,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異薪铜,居然都是意外死亡众弓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門隔箍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谓娃,“玉大人,你說我怎么就攤上這事蜒滩”醮铮” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵俯艰,是天一觀的道長(zhǎng)捡遍。 經(jīng)常有香客問我,道長(zhǎng)蟆炊,這世上最難降的妖魔是什么稽莉? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮涩搓,結(jié)果婚禮上污秆,老公的妹妹穿的比我還像新娘。我一直安慰自己昧甘,他們只是感情好良拼,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著充边,像睡著了一般庸推。 火紅的嫁衣襯著肌膚如雪常侦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天贬媒,我揣著相機(jī)與錄音聋亡,去河邊找鬼。 笑死际乘,一個(gè)胖子當(dāng)著我的面吹牛坡倔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播脖含,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼罪塔,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了养葵?” 一聲冷哼從身側(cè)響起征堪,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎关拒,沒想到半個(gè)月后佃蚜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夏醉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年爽锥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畔柔。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖臣樱,靈堂內(nèi)的尸體忽然破棺而出靶擦,到底是詐尸還是另有隱情,我是刑警寧澤雇毫,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布玄捕,位于F島的核電站,受9級(jí)特大地震影響棚放,放射性物質(zhì)發(fā)生泄漏枚粘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一飘蚯、第九天 我趴在偏房一處隱蔽的房頂上張望馍迄。 院中可真熱鬧,春花似錦局骤、人聲如沸攀圈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赘来。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間犬辰,已是汗流浹背嗦篱。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留幌缝,地道東北人灸促。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像狮腿,于是被迫代替她去往敵國(guó)和親腿宰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理缘厢,服務(wù)發(fā)現(xiàn)吃度,斷路器,智...
    卡卡羅2017閱讀 134,704評(píng)論 18 139
  • 【西游殤目錄】歡迎戳進(jìn)來 【上一章】西游殤(78)摘果 前情摘要: 一道血芒在黑暗中乍現(xiàn)贴硫,獅駝王彎弓搭箭射向萬壽山...
    傅人閱讀 3,230評(píng)論 45 62
  • 舒適圈到底是有吸引力的椿每,有組織的保護(hù)層,有穩(wěn)定的經(jīng)濟(jì)收入英遭,有看得見间护、摸得著的小幸福。沒有理想挖诸,走出圈子汁尺,有何意義?...
    他像一個(gè)球閱讀 299評(píng)論 0 0
  • 嬋娟夜籠紗多律,魚鱗起波紋 孤棹江湄立痴突,相思愁煞人
    栩辰徉閱讀 458評(píng)論 14 22
  • HttpSessionListener接口監(jiān)聽Session的創(chuàng)建和失效spring 使用 shiro 后,由于s...
    沒事遛彎閱讀 4,092評(píng)論 1 0