posts - 193,  comments - 520,  trackbacks - 0
          一、執(zhí)行期根據(jù)方法的名稱來執(zhí)行方法
          下面的示例演示了這一操作:
          import java.lang.reflect.*;
          public class method2 {
             
          public int add(int a, int b) {
                 
          return a + b;
             }

             
          public static void main(String args[]) {
                 
          try {
                     Class cls 
          = Class.forName("method2");
                     Class partypes[] 
          = new Class[2];
                     partypes[
          0= Integer.TYPE;
                     partypes[
          1= Integer.TYPE;
                     Method meth 
          = cls.getMethod("add", partypes);
                     method2 methobj 
          = new method2();
                     Object arglist[] 
          = new Object[2];
                     arglist[
          0= new Integer(37);
                     arglist[
          1= new Integer(47);
                     Object retobj 
          = meth.invoke(methobj, arglist);
                     Integer retval 
          = (Integer) retobj;
                     System.out.println(retval.intvalue());
                 }
           catch (Throwable e) {
                     System.err.println(e);
                 }

             }

          }

          注:上面劃線的粗體字最好用Object methobj =  cls.newInstance();來代替,原因很明顯如果這個(gè)類及方法事先都是清楚的也不需要用reflection了
              假如一個(gè)程序在執(zhí)行的某處的時(shí)候才知道需要執(zhí)行某個(gè)方法,這個(gè)方法的名稱是在程序的運(yùn)行過程中指定的 (例如,JavaBean 開發(fā)環(huán)境中就會(huì)做這樣的事),那么上面的程序演示了如何做到。上例中,getMethod 用于查找一個(gè)具有兩個(gè)整型參數(shù)且名為 add 的方法。找到該方法并創(chuàng)建了相應(yīng)的 Method 對象之后,在正確的對象實(shí)例中執(zhí)行它。執(zhí)行該方法的時(shí)候,需要提供一個(gè)參數(shù)列表,這在上例中是分別包裝了整數(shù) 37 和 47 的兩個(gè) Integer 對象。執(zhí)行方法的返回的同樣是一個(gè) Integer 對象,它封裝了返回值 84。

          二、執(zhí)行期創(chuàng)建新的對象

          對于構(gòu)造器,則不能像執(zhí)行方法那樣進(jìn)行,因?yàn)閳?zhí)行一個(gè)構(gòu)造器就意味著創(chuàng)建了一個(gè)新的對象 (準(zhǔn)確的說,創(chuàng)建一個(gè)對象的過程包括分配內(nèi)存和構(gòu)造對象)。所以,與上例最相似的例子如下:

          import java.lang.reflect.*;
          public class constructor2 {
             
          public constructor2() {
             }

             
          public constructor2(int a, int b) {
                 System.out.println(
          "a = " + a + " b = " + b);
             }

             
          public static void main(String args[]) {
                 
          try {
                     Class cls 
          = Class.forName("constructor2");
                     Class partypes[] 
          = new Class[2];
                     partypes[
          0= Integer.TYPE;
                     partypes[
          1= Integer.TYPE;
                     Constructor ct 
          = cls.getConstructor(partypes);
                     Object arglist[] 
          = new Object[2];
                     arglist[
          0= new Integer(37);
                     arglist[
          1= new Integer(47);
                     Object retobj 
          = ct.newInstance(arglist);
                 }
           catch (Throwable e) {
                     System.err.println(e);
                 }

             }

          }

          三、改變字段(域)的值

          reflection 的還有一個(gè)用處就是改變對象數(shù)據(jù)字段的值。reflection 可以從正在運(yùn)行的程序中根據(jù)名稱找到對象的字段并改變它,下面的例子可以說明這一點(diǎn):

          import java.lang.reflect.*;
          public class field2 {
             
          public double d;
             
          public static void main(String args[]) {
                 
          try {
                     Class cls 
          = Class.forName("field2");
                     Field fld 
          = cls.getField("d");
                     field2 f2obj 
          = new field2();
                     System.out.println(
          "d = " + f2obj.d);
                     fld.setDouble(f2obj, 
          12.34);
                     System.out.println(
          "d = " + f2obj.d);
                 }
           catch (Throwable e) {
                     System.err.println(e);
                 }

             }

          }
          這個(gè)例子中,字段 d 的值被變?yōu)榱?12.34。
          實(shí)際開發(fā)時(shí)用Common BeanUtils

          http://www.aygfsteel.com/ronghao 榮浩原創(chuàng),轉(zhuǎn)載請注明出處:)
          posted on 2006-01-17 17:41 ronghao 閱讀(586) 評論(0)  編輯  收藏 所屬分類: j2se基礎(chǔ)
          <2006年1月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          關(guān)注工作流和企業(yè)業(yè)務(wù)流程改進(jìn)。現(xiàn)就職于ThoughtWorks。新浪微博:http://weibo.com/ronghao100

          常用鏈接

          留言簿(38)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          常去的網(wǎng)站

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 札达县| 绥化市| 嘉峪关市| 临朐县| 三河市| 阳信县| 迁西县| 城口县| 马边| 阿巴嘎旗| 双城市| 新田县| 阿坝县| 西吉县| 玉溪市| 禹州市| 崇明县| 时尚| 万源市| 绥宁县| 龙岩市| 萨嘎县| 祁东县| 高邑县| 万源市| 绥滨县| 望城县| 娄烦县| 平阴县| 昌宁县| 伊金霍洛旗| 青海省| 河东区| 白城市| 沂源县| 望江县| 昌图县| 新化县| 清流县| 满洲里市| 丹寨县|