<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    冰浪

    哥已不再年輕 - 堅定夢想,畢生追求!
    posts - 85, comments - 90, trackbacks - 0, articles - 3
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    [轉]利用反射動態調用類成員

    Posted on 2007-07-11 20:32 冰浪 閱讀(348) 評論(0)  編輯  收藏 所屬分類: Java

    使用反射來調用類的方法,需要使用java.lang.reflect.Method中的invoke方法,Object??invoke(Object obj, Object[] args),第一個參數是指需要調用的那個方法的隱式參數,也即那個方法所屬的對象,如果調用的是一個靜態方法將第一個參數指定為null,第二個參數是指需要調用的那個方法的顯式參數,因為一個方法可以有很多個參數所以在這里我們必須用一個數組來存放這些參數,注意這個方法使用的是對象數組,在存放時盡管有值類型我們也要把相應的包裝器類存放進去,當調用的這個方法有返回值,這在Java中是一個令人煩惱的問題,如果返回來的是一個對象還好,我們只需將invoke返回的Object強制轉換成特定的對象就可以,可是返回一個值類型呢?我們要使用就麻煩了,首先要對其解包裝,在用其包裝對象的方法返回普通值!我們編程思路很重要是吧!

    編程的基本思路:

    首先獲得需要被調用的方法的指針,其實說指針不是那么好理解,而java的方法指針也一度的引起很大的爭論,我們干脆叫引用吧!怎么獲的引用呢?可使用Class類的getMethod方法該方法返回一個Method,接著我們在使用Method的invoke方法調用這個引用所指向的方法,就這么簡單,我一直認為用一個簡單的例子講訴一個復雜的概念是最注重實效的!(在JDK1.4下調試通過)

    import java.lang.reflect.*;

    public class InvokeMethods
    {
     public static void main(String[] args)
     {
                    Employee emp = new Employee();
                   
                    ///getClass獲得emp對象所屬的類型的對象,Class就是類的類
                    ///Class是專門用來描述類的類,比如描述某個類有那些字段,
                    ///方法,構造器等等!
                    Class cl = emp.getClass();
                    try
                    {
                        ///getMethod方法第一個參數指定一個需要調用的方法名稱
                        ///這里是Employee類的setAge方法,第二個參數是需要調用
                        ///方法的參數類型列表,是參數類型!如無參數可以指定null
                        ///該方法返回一個方法對象
                        Method sAge = cl.getMethod("setAge",
       new Class[] {int.class});
      
                        Method gAge = cl.getMethod("getAge",null);
     
                        Method pName = cl.getMethod("printName",
       new Class[] {String.class});
         
                        /**
            *使用invoke調用指定的方法
           */
                        Object[] args1 = { new Integer(25) };//參數列表
                        //emp為隱式參數該方法不是靜態方法必須指定
                        sAge.invoke(emp, args1);
     
                        Integer AGE = (Integer)gAge.invoke(emp, null);
                        int age = AGE.intValue();
                        System.out.println("The Employee Age is: "+age);
     
                        Object[] args3 = {new String("Jack") };
                        pName.invoke(emp, args3);
                    }
                    catch(Exception e) {e.printStackTrace(); }
                    System.exit(0);
     }
     
    }

    class Employee
    {
      //定義一個員工類
     public Employee()
     {
      age = 0;
      name = null;
     }
     
    //將要被調用的方法
     public void setAge(int a)
     {
      age = a;
     }
     
      //將要被調用的方法
     public int getAge()
     {
      return age;
     }
     
     //將要被調用的方法
     public void printName(String n)
     {
      name = n;
      System.out.println("The Employee Name is: "+name);
     }
     
     private int age;
     private String name;
    }

     


    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=41104

     

    主站蜘蛛池模板: 亚洲精品亚洲人成在线播放| 污视频网站在线免费看| 欧洲精品免费一区二区三区 | 成年免费a级毛片| 国产av无码专区亚洲av桃花庵| 亚洲大片免费观看| 国产精品亚洲一区二区三区久久| 国产国拍亚洲精品mv在线观看| 岛国av无码免费无禁网站| 国产免费黄色无码视频| 亚洲激情校园春色| 亚洲日韩人妻第一页| 91免费播放人人爽人人快乐| 日本视频免费观看| 亚洲另类古典武侠| 亚洲日韩国产精品第一页一区| 欧美大尺寸SUV免费| 日韩成人免费视频| 国产AV无码专区亚洲AV琪琪| 亚洲黄色在线视频| 在线亚洲97se亚洲综合在线| 女人与禽交视频免费看| 免费国产黄网站在线观看可以下载| 美女无遮挡免费视频网站| 亚洲国产成人久久综合一区| 亚洲精品午夜无码电影网| 免费国产在线观看老王影院| 青娱乐免费在线视频| 久久免费精品视频| 国产精品永久免费| 特黄特色大片免费| 亚洲色成人WWW永久在线观看| 亚洲欧洲日韩国产综合在线二区| 亚洲一级大黄大色毛片| 亚洲亚洲人成综合网络| 亚洲成年看片在线观看| 暖暖在线日本免费中文| 在线视频观看免费视频18| 免费国产在线视频| 中文在线观看永久免费| CAOPORM国产精品视频免费|