posts - 73,  comments - 55,  trackbacks - 0
          (轉(zhuǎn)自:http://blog.csdn.net/nomads/archive/2006/09/05/1178867.aspx)
          Java提供了一套機(jī)制來(lái)動(dòng)態(tài)執(zhí)行方法和構(gòu)造方法,以及數(shù)組操作等,這套機(jī)制就叫——反射。反射機(jī)制是如今很多流行框架的實(shí)現(xiàn)基礎(chǔ),其中包括Spring、Hibernate等。原理性的問題不是本文的重點(diǎn),接下來(lái)讓我們?cè)趯?shí)例中學(xué)習(xí)這套精彩的機(jī)制。

          1. 得到某個(gè)對(duì)象的屬性

          1?public?Object?getProperty(Object?owner,?String?fieldName)?throws?Exception?{
          2?????Class?ownerClass?=?owner.getClass();
          3?
          4?????Field?field?=?ownerClass.getField(fieldName);
          5?
          6?????Object?property?=?field.get(owner);
          7?
          8?????return?property;
          9?}

          Class ownerClass = owner.getClass():得到該對(duì)象的Class。

          Field field = ownerClass.getField(fieldName):通過Class得到類聲明的屬性。

          Object property = field.get(owner):通過對(duì)象得到該屬性的實(shí)例,如果這個(gè)屬性是非公有的,這里會(huì)報(bào)IllegalAccessException。



          2. 得到某個(gè)類的靜態(tài)屬性

          ?1?public?Object?getStaticProperty(String?className,?String?fieldName)
          ?2?????????????throws?Exception?{
          ?3?????Class?ownerClass?=?Class.forName(className);
          ?4?
          ?5?????Field?field?=?ownerClass.getField(fieldName);
          ?6?
          ?7?????Object?property?=?field.get(ownerClass);
          ?8?
          ?9?????return?property;
          10?}


          Class ownerClass = Class.forName(className) :首先得到這個(gè)類的Class。

          Field field = ownerClass.getField(fieldName):和上面一樣,通過Class得到類聲明的屬性。

          Object property = field.get(ownerClass) :這里和上面有些不同,因?yàn)樵搶傩允庆o態(tài)的,所以直接從類的Class里取。


          3. 執(zhí)行某對(duì)象的方法

          ?1?public?Object?invokeMethod(Object?owner,?String?methodName,?Object[]?args)?throws?Exception?{
          ?2?
          ?3?????Class?ownerClass?=?owner.getClass();
          ?4?
          ?5?????Class[]?argsClass?=?new?Class[args.length];
          ?6?
          ?7?????for?(int?i?=?0,?j?=?args.length;?i?<?j;?i++)?{
          ?8?????????argsClass[i]?=?args[i].getClass();
          ?9?????}
          10?
          11?????Method?method?=?ownerClass.getMethod(methodName,?argsClass);
          12?
          13?????return?method.invoke(owner,?args);
          14?}

          Class owner_class = owner.getClass() :首先還是必須得到這個(gè)對(duì)象的Class。

          5~9行:配置參數(shù)的Class數(shù)組,作為尋找Method的條件。

          Method method = ownerClass.getMethod(methodName, argsClass):通過Method名和參數(shù)的Class數(shù)組得到要執(zhí)行的Method。

          method.invoke(owner, args):執(zhí)行該Method,invoke方法的參數(shù)是執(zhí)行這個(gè)方法的對(duì)象,和參數(shù)數(shù)組。返回值是Object,也既是該方法的返回值。


          4. 執(zhí)行某個(gè)類的靜態(tài)方法

          ?1?public?Object?invokeStaticMethod(String?className,?String?methodName,
          ?2?????????????Object[]?args)?throws?Exception?{
          ?3?????Class?ownerClass?=?Class.forName(className);
          ?4?
          ?5?????Class[]?argsClass?=?new?Class[args.length];
          ?6?
          ?7?????for?(int?i?=?0,?j?=?args.length;?i?<?j;?i++)?{
          ?8?????????argsClass[i]?=?args[i].getClass();
          ?9?????}
          10?
          11?????Method?method?=?ownerClass.getMethod(methodName,?argsClass);
          12?
          13?????return?method.invoke(null,?args);
          14?}


          基本的原理和實(shí)例3相同,不同點(diǎn)是最后一行,invoke的一個(gè)參數(shù)是null,因?yàn)檫@是靜態(tài)方法,不需要借助實(shí)例運(yùn)行。



          5. 新建實(shí)例
          ?1?
          ?2?public?Object?newInstance(String?className,?Object[]?args)?throws?Exception?{
          ?3?????Class?newoneClass?=?Class.forName(className);
          ?4?
          ?5?????Class[]?argsClass?=?new?Class[args.length];
          ?6?
          ?7?????for?(int?i?=?0,?j?=?args.length;?i?<?j;?i++)?{
          ?8?????????argsClass[i]?=?args[i].getClass();
          ?9?????}
          10?
          11?????Constructor?cons?=?newoneClass.getConstructor(argsClass);
          12?
          13?????return?cons.newInstance(args);
          14?
          15?}


          這里說(shuō)的方法是執(zhí)行帶參數(shù)的構(gòu)造函數(shù)來(lái)新建實(shí)例的方法。如果不需要參數(shù),可以直接使用newoneClass.newInstance()來(lái)實(shí)現(xiàn)。

          Class newoneClass = Class.forName(className):第一步,得到要構(gòu)造的實(shí)例的Class。

          第5~第9行:得到參數(shù)的Class數(shù)組。

          Constructor cons = newoneClass.getConstructor(argsClass):得到構(gòu)造子。

          cons.newInstance(args):新建實(shí)例。


          6. 判斷是否為某個(gè)類的實(shí)例

          1?public?boolean?isInstance(Object?obj,?Class?cls)?{
          2?????return?cls.isInstance(obj);
          3?}



          7. 得到數(shù)組中的某個(gè)元素
          1?public?Object?getByArray(Object?array,?int?index)?{
          2?????return?Array.get(array,index);
          3?}



          附完整源碼:

          import?java.lang.reflect.Array;
          import?java.lang.reflect.Constructor;
          import?java.lang.reflect.Field;
          import?java.lang.reflect.Method;


          /**
          ?*?Java?Reflection?Cookbook
          ?*
          ?*?
          @author?Michael?Lee
          ?*?
          @since?2006-8-23
          ?*?
          @version?0.1a
          ?
          */

          public?class?Reflection?{
          ????
          /**
          ?????*?得到某個(gè)對(duì)象的公共屬性
          ?????*
          ?????*?
          @param?owner,?fieldName
          ?????*?
          @return?該屬性對(duì)象
          ?????*?
          @throws?Exception
          ?????*
          ?????
          */
          ????
          public?Object?getProperty(Object?owner,?String?fieldName)?throws?Exception?{
          ????????Class?ownerClass?
          =?owner.getClass();

          ????????Field?field?
          =?ownerClass.getField(fieldName);

          ????????Object?property?
          =?field.get(owner);

          ????????
          return?property;
          ????}

          ????
          /**
          ?????*?得到某類的靜態(tài)公共屬性
          ?????*
          ?????*?
          @param?className???類名
          ?????*?
          @param?fieldName???屬性名
          ?????*?
          @return?該屬性對(duì)象
          ?????*?
          @throws?Exception
          ?????
          */
          ????
          public?Object?getStaticProperty(String?className,?String?fieldName)
          ????????????
          throws?Exception?{
          ????????Class?ownerClass?
          =?Class.forName(className);

          ????????Field?field?
          =?ownerClass.getField(fieldName);

          ????????Object?property?
          =?field.get(ownerClass);

          ????????
          return?property;
          ????}


          ????
          /**
          ?????*?執(zhí)行某對(duì)象方法
          ?????*
          ?????*?
          @param?owner
          ?????*????????????對(duì)象
          ?????*?
          @param?methodName
          ?????*????????????方法名
          ?????*?
          @param?args
          ?????*????????????參數(shù)
          ?????*?
          @return?方法返回值
          ?????*?
          @throws?Exception
          ?????
          */
          ????
          public?Object?invokeMethod(Object?owner,?String?methodName,?Object[]?args)
          ????????????
          throws?Exception?{

          ????????Class?ownerClass?
          =?owner.getClass();

          ????????Class[]?argsClass?
          =?new?Class[args.length];

          ????????
          for?(int?i?=?0,?j?=?args.length;?i?<?j;?i++)?{
          ????????????argsClass[i]?
          =?args[i].getClass();
          ????????}

          ????????Method?method?
          =?ownerClass.getMethod(methodName,?argsClass);

          ????????
          return?method.invoke(owner,?args);
          ????}


          ??????
          /**
          ?????*?執(zhí)行某類的靜態(tài)方法
          ?????*
          ?????*?
          @param?className
          ?????*????????????類名
          ?????*?
          @param?methodName
          ?????*????????????方法名
          ?????*?
          @param?args
          ?????*????????????參數(shù)數(shù)組
          ?????*?
          @return?執(zhí)行方法返回的結(jié)果
          ?????*?
          @throws?Exception
          ?????
          */
          ????
          public?Object?invokeStaticMethod(String?className,?String?methodName,
          ????????????Object[]?args)?
          throws?Exception?{
          ????????Class?ownerClass?
          =?Class.forName(className);

          ????????Class[]?argsClass?
          =?new?Class[args.length];

          ????????
          for?(int?i?=?0,?j?=?args.length;?i?<?j;?i++)?{
          ????????????argsClass[i]?
          =?args[i].getClass();
          ????????}

          ????????Method?method?
          =?ownerClass.getMethod(methodName,?argsClass);

          ????????
          return?method.invoke(null,?args);
          ????}



          ????
          /**
          ?????*?新建實(shí)例
          ?????*
          ?????*?
          @param?className
          ?????*????????????類名
          ?????*?
          @param?args
          ?????*????????????構(gòu)造函數(shù)的參數(shù)
          ?????*?
          @return?新建的實(shí)例
          ?????*?
          @throws?Exception
          ?????
          */
          ????
          public?Object?newInstance(String?className,?Object[]?args)?throws?Exception?{
          ????????Class?newoneClass?
          =?Class.forName(className);

          ????????Class[]?argsClass?
          =?new?Class[args.length];

          ????????
          for?(int?i?=?0,?j?=?args.length;?i?<?j;?i++)?{
          ????????????argsClass[i]?
          =?args[i].getClass();
          ????????}

          ????????Constructor?cons?
          =?newoneClass.getConstructor(argsClass);

          ????????
          return?cons.newInstance(args);

          ????}


          ????
          ????
          /**
          ?????*?是不是某個(gè)類的實(shí)例
          ?????*?
          @param?obj?實(shí)例
          ?????*?
          @param?cls?類
          ?????*?
          @return?如果?obj?是此類的實(shí)例,則返回?true
          ?????
          */
          ????
          public?boolean?isInstance(Object?obj,?Class?cls)?{
          ????????
          return?cls.isInstance(obj);
          ????}
          ????
          ????
          /**
          ?????*?得到數(shù)組中的某個(gè)元素
          ?????*?
          @param?array?數(shù)組
          ?????*?
          @param?index?索引
          ?????*?
          @return?返回指定數(shù)組對(duì)象中索引組件的值
          ?????
          */
          ????
          public?Object?getByArray(Object?array,?int?index)?{
          ????????
          return?Array.get(array,index);
          ????}
          }
          ?
          posted on 2007-01-12 10:03 保爾任 閱讀(525) 評(píng)論(2)  編輯  收藏 所屬分類: J2SE

          FeedBack:
          # re: Java反射經(jīng)典實(shí)例 Java Reflection Cookbook
          2008-01-23 14:51 | 路人
          不錯(cuò)的文章  回復(fù)  更多評(píng)論
            
          # re: Java反射經(jīng)典實(shí)例 Java Reflection Cookbook [未登錄]
          2014-10-22 11:03 | 路人
          不錯(cuò)的文章  回復(fù)  更多評(píng)論
            

          <2007年1月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 石景山区| 台东市| 大英县| 陈巴尔虎旗| 卢龙县| 阳山县| 台北市| 新乡县| 华容县| 惠安县| 侯马市| 威信县| 揭东县| 襄汾县| 长泰县| 恭城| 宜都市| 托里县| 鹤山市| 景东| 高淳县| 雷波县| 苗栗县| 江山市| 龙门县| 离岛区| 平山县| 济宁市| 皋兰县| 忻州市| 阳高县| 三亚市| 莎车县| 新民市| 尚义县| 石柱| 渝北区| 麻江县| 鹤峰县| 彰武县| 三穗县|