全面總結(jié): Java中的反射與注解

96

Java反射機(jī)制經(jīng)常與注解搭配荚坞,出現(xiàn)在各大框架中盖灸,是框架的靈魂所在盟榴,貫穿了整個(gè)框架的構(gòu)成酬诀。在此對(duì)這兩個(gè)Java特性做一個(gè)總結(jié)脏嚷。

反射

能夠分析類能力的程序成為反射(reflective)---from Java核心技術(shù)卷Ⅰ

通過Java的反射機(jī)制,可以在程序中訪問已經(jīng)加載到JVM中的Java對(duì)象的描述料滥,實(shí)現(xiàn)訪問然眼、檢測(cè)艾船、修復(fù)和修改描述Java本身對(duì)象的功能葵腹,Java中的java.lang.reflect包提供使用注解功能高每。

那么,++如何才能分析類能力呢践宴?++首先需要得到類對(duì)象鲸匿,獲取類對(duì)象有三種方法,分別是:

1. Class cl = Class.forName("全類名");
2. Class cl = 類名.class;
3. Class cl = 對(duì)象.getClass();

快速使用阻肩,獲取MyObject類的所有方法并打哟丁:

Method[] methods = MyObject.class.getMethods();
for(Method method : methods){
  System.out.println("method = " + method.getName());
}

通過獲取到的類對(duì)象,就能輕松的得到類的成員變量烤惊、構(gòu)造方法乔煞、成員方法、類名柒室、注解等等渡贾。具體獲取方法有很多,不在此一一例舉了雄右。

注解

注解(也被稱為元數(shù)據(jù))為我們?cè)诖a中添加信息提供了一種形式化的方法空骚,使我們可以在稍后某個(gè)時(shí)刻非常方便地使用這些數(shù)據(jù)。 ---from Java編程思想

注解是眾多引入到JavaSE5中的重要的語言變化之一擂仍。它們可以提供用來完整地描述程序所需地信息囤屹,而這些信息是無法用Java來表達(dá)的。注解使得我們能夠以將由編譯器來測(cè)試和驗(yàn)證的格式逢渔,存儲(chǔ)有關(guān)程序的額外信息肋坚。注解可以用來生成描述符文件,甚至或是新的類的定義复局。

注解形式:

public @interface Action {  // 無屬性值
}

public @interface Action { // 有屬性值 
   String action() default "A";
   int value() default  0;
}

元注解:用于描述注解的注解

  1. @Target:描述注解能用作用的位置

    • ANNOTATION_TYPE:表示用于Annotation的類型
    • TYPE:作用與類冲簿、接口、枚舉
    • CONSTRUCTOR:作用于構(gòu)造方法
    • FIELD:作用于屬性
    • METHOD:作用于方法
    • PARAMETER:作用于參數(shù)
    • LOCAL_VARIABLE:表示局部變量
    • PACKAGE:表示用于包
  2. @Retention:設(shè)置注解的有效范圍

    1. SOURCE:不編譯到Annotation類的文件中
    2. CLASS:編譯到Annotation的文件中亿昏,運(yùn)行時(shí)不加在到JVM中
    3. RUNTING:運(yùn)行時(shí)加載到JVM中峦剔,有效范圍最大
  3. Decomented: 注解會(huì)在API文檔中體現(xiàn)

  4. Inherited: 描述注解是否被子類繼承

注解與反射:實(shí)例

聲明兩個(gè)注解:

@Target(ElementType.CONSTRUCTOR)
@Retention(RetentionPolicy.RUNTIME)
public @interface Action {
   String action() default "構(gòu)造函數(shù)";
}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldAnnotation {
   String describe() default "描述";
   Class type() default void.class;

注解@Action 使用于構(gòu)造函數(shù),有一個(gè)描述屬性角钩,@FieldAnnotation適用于注解屬性常量吝沫,包含一個(gè)String類型的描述和修飾的類型


使用注解:

public class ConstructorExample {

   @FieldAnnotation(describe = "名字" ,type = String.class)
   public String name;
   @FieldAnnotation(describe = "分?jǐn)?shù)",type = int.class)
   protected int core;

   @Action()
   public ConstructorExample(String name, int core) throws NumberFormatException {
      this.core = core;
      this.name = name;
   }
}

反射獲取:

public class ReflectConstructor {

   public static void main(String[] args) {
      ConstructorExample constructorExample = new ConstructorExample("ABC",10);
      Class<? extends ConstructorExample> classExample = constructorExample.getClass();
      Constructor[] constructors = classExample.getDeclaredConstructors();
      for (int i = 0; i < constructors.length; i++) {
         Constructor constructor = constructors[i];
         if (constructor.isAnnotationPresent(Action.class)){//是否包含Action.class注解
            System.out.println("包含Action注解");
            Action action = (Action) constructor.getAnnotation(Action.class);
            System.out.println("注解值為 :"+action.action());
         }
         System.out.println("-------------");
      }

      Field[] fields = classExample.getDeclaredFields();
      for (Field f: fields) {
         System.out.println("屬性名稱 = "+f.getName());
         System.out.println("屬性類型 = "+f.getType());
         try {
            if (f.isAnnotationPresent(FieldAnnotation.class)) {
               System.out.println("使用FieldAnnotation注解");
               FieldAnnotation annotation = f.getAnnotation(FieldAnnotation.class);
               System.out.println("FieldAnnotation注解參數(shù):");
               System.out.println("Describe:"+annotation.describe());
               System.out.println("Type:"+annotation.type());
            }

         } catch (Exception e) {
            e.printStackTrace();
         }
         System.out.println("-------------");
      }
   }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末递礼,一起剝皮案震驚了整個(gè)濱河市惨险,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脊髓,老刑警劉巖辫愉,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異将硝,居然都是意外死亡恭朗,警方通過查閱死者的電腦和手機(jī)屏镊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痰腮,“玉大人而芥,你說我怎么就攤上這事“蛑担” “怎么了棍丐?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)沧踏。 經(jīng)常有香客問我歌逢,道長(zhǎng),這世上最難降的妖魔是什么翘狱? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任趋翻,我火速辦了婚禮,結(jié)果婚禮上盒蟆,老公的妹妹穿的比我還像新娘踏烙。我一直安慰自己,他們只是感情好历等,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布讨惩。 她就那樣靜靜地躺著,像睡著了一般寒屯。 火紅的嫁衣襯著肌膚如雪荐捻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天寡夹,我揣著相機(jī)與錄音处面,去河邊找鬼。 笑死菩掏,一個(gè)胖子當(dāng)著我的面吹牛魂角,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播智绸,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼野揪,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了瞧栗?” 一聲冷哼從身側(cè)響起斯稳,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎迹恐,沒想到半個(gè)月后挣惰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年憎茂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唆涝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唇辨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出能耻,到底是詐尸還是另有隱情赏枚,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布晓猛,位于F島的核電站饿幅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏戒职。R本人自食惡果不足惜栗恩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望洪燥。 院中可真熱鬧磕秤,春花似錦、人聲如沸捧韵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽再来。三九已至蒙兰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芒篷,已是汗流浹背搜变。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留针炉,地道東北人挠他。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像篡帕,于是被迫代替她去往敵國和親绩社。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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

  • 前言 現(xiàn)在在我們構(gòu)建自己或公司的項(xiàng)目中赂苗,或多或少都會(huì)依賴幾個(gè)流行比較屌的第三方庫愉耙,比如:Butter Knife、...
    戴定康閱讀 3,940評(píng)論 0 17
  • 什么是注解(Annotation):Annotation(注解)就是Java提供了一種元程序中的元素關(guān)聯(lián)任何信息和...
    九尾喵的薛定諤閱讀 3,174評(píng)論 0 2
  • 前言拌滋,本來只是想研究一下注解的朴沿,不過發(fā)現(xiàn),要懂注解先得懂反射,別問我為什么赌渣,你可以自己試試 JAVA反射 主要是指...
    justCode_閱讀 1,225評(píng)論 2 9
  • 一魏铅、概念 ??Annotation(注解)就是Java提供了一種源程序中的元素關(guān)聯(lián)任何信息和任何元數(shù)據(jù)(metad...
    從菜鳥到老菜鳥閱讀 2,111評(píng)論 0 2
  • 從JDK5開始,Java增加了Annotation(注解)坚芜,Annotation是代碼里的特殊標(biāo)記览芳,這些標(biāo)記可以在...
    CarlosLynn閱讀 566評(píng)論 0 2