JAVA中的反射機(jī)制

          Posted on 2011-07-28 13:45 無很 閱讀(213) 評(píng)論(0)  編輯  收藏

          JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為java語(yǔ)言的反射機(jī)制。
          Java反射機(jī)制主要提供了以下功能: 在運(yùn)行時(shí)分析類的能力,判斷任意對(duì)象所屬類,類中有哪些方法,有哪些成員變量;在運(yùn)行時(shí)控查對(duì)象,比如,只寫一個(gè)toString()方法供所有的類使用;實(shí)現(xiàn)通用數(shù)組操作代碼的功能。

          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 }
          這里說的方法是執(zhí)行帶參數(shù)的構(gòu)造函數(shù)來新建實(shí)例的方法。如果不需要參數(shù),可以直接使用newoneClass.newInstance()來實(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 }
          其中,反射機(jī)制最重要的部分是允許你檢查類的結(jié)構(gòu)。java.lang.reflect包中的三個(gè)類Field,Method,Constructor類分別描述類的字段,方法和構(gòu)造器,它們都有一個(gè)getName方法,用來返回相應(yīng)條目的名稱。


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 安阳县| 莱西市| 罗城| 潮州市| 科技| 鹿邑县| 武夷山市| 三台县| 嫩江县| 枝江市| 织金县| 岳西县| 黄梅县| 留坝县| 遵化市| 横峰县| 辽宁省| 农安县| 行唐县| 渭南市| 宁阳县| 定陶县| 高邮市| 榆中县| 南漳县| 万安县| 陕西省| 巨野县| 麦盖提县| 永福县| 绥中县| 台江县| 萍乡市| 纳雍县| 同心县| 铁岭县| 仙居县| 富裕县| 卢湾区| 无锡市| 湖州市|