<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

     

    主站蜘蛛池模板: 2020年亚洲天天爽天天噜| 在线观看免费为成年视频| 男人和女人高潮免费网站| 色噜噜狠狠色综合免费视频| 美女露100%胸无遮挡免费观看| 亚洲中文字幕精品久久| 高潮毛片无遮挡高清免费| 一级一看免费完整版毛片| 亚洲高清免费视频| 亚洲VA综合VA国产产VA中| 久久w5ww成w人免费| 免费毛片a线观看| 精品视频在线免费观看| 一区二区在线免费视频| 国产精品亚洲一区二区在线观看| 精品亚洲AV无码一区二区| 久久亚洲日韩看片无码| 亚洲电影中文字幕| 中文字幕在线观看亚洲| 亚洲人成在线播放网站岛国| 亚洲国产精品久久久久网站| 亚洲今日精彩视频| 亚洲中文字幕久久精品无码2021| 亚洲另类小说图片| 亚洲爆乳AAA无码专区| 特级做a爰片毛片免费看| 免费看一区二区三区四区| 国产成人精品久久免费动漫| 久久久久久久91精品免费观看| 国产一卡二卡3卡四卡免费| 日本黄色免费观看| 相泽亚洲一区中文字幕| 亚洲精品国产免费| 国产产在线精品亚洲AAVV| 中文字幕a∨在线乱码免费看| 99久在线国内在线播放免费观看 | 无码精品A∨在线观看免费| 国内一级一级毛片a免费| 中文字幕亚洲专区| 亚洲另类无码一区二区三区| 99在线热播精品免费99热|