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

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

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

    posts - 262,  comments - 221,  trackbacks - 0
    【1】Method類簡介
    Java反射技術的一個基本應用之一就是在運行時期間動態地調用方法。要動態地調用方法,首先要獲得方法本身。步驟如下:
      1.獲得Class對象
      2.調用Class對象的getMethod(String, Class[])方法獲得指定的方法
     
    getMethod方法的第一個參數用來指定方法的名稱,第二個參數是一個Class數組,用來存放代表各個參數類型的Class對象。這個方法有一個值得注意的地方:
     
    如果參數類型是原子類型(int,long,short等),要使用諸如int.class,long.class來獲取其對應Class對象,而不能使用對應的封裝類對象。
     
    在獲得Method對象之后,就可以在運行時動態地調用方法了。Method類里面最主要的方法有以下幾種
      1.獲取方法所在的類:                     getDeclaringClass()
      2.獲取方法簽名中所有聲明的拋出異常:getExceptionTypes()
      3.獲取方法簽名中所有參數的類型:     getParameterTypes()
      4.獲取方法簽名中返回值的類型:        getReturnType()
      5.調用方法:                               Object invoke(Object obj, Object... args)
     
    Method類的核心就是invoke方法,該方法用于Method對象喚起對象中對應的方法,特別要注意的是第二個參數:通常這是一個Object數組,這意味著如果參數是原子類型數據,必須先把他轉換成對應的封裝類對象,invoke方法會在后臺自動將其解壓成原子類型。
     
    從JDK1.5開始之后,增加了"自動裝箱"和"自動開箱"的功能,所以你可以看到在行61處,使用了原子類型數據而非封裝類來傳遞參數。如果是在JDK1.4或以下版本,則此處會報錯。建議不采用此種做法,以免出現數據類型完全的問題。


    【2】使用反射拷貝對象的思路
     1. 獲取源對象的所有成員變量列表

     2. 每次取出變量列表中的一個變量,獲取其getXxx()和setXxx(Type)方法名稱

     3. 根據getXxx()和setXxx(Type)方法名稱獲得對應的Method對象

     4. 源對象通過invoke(Object, Class[])方法調用getXxx()方法,獲得成員變量的值

     5. 目標對象通過invoke(Object, Class[])的方法的setXxx(Type)方法,為目標對象的成員變量賦值
      
    其中關鍵的代碼段格式如下:

     1. 創建Method對象:Class.getMethod(method name, method prameters class array)

     2. 調用方法:method.invoke(object, method parameters class array)


    【3】示例代碼
            // 獲得對象的所有屬性
            Field fields[] = classType.getDeclaredFields();

            
    for (int i = 0; i < fields.length; i++) {
                Field field 
    = fields[i];

                String fieldName 
    = field.getName();
                String firstLetter 
    = fieldName.substring(01).toUpperCase();

                
    // 獲得和屬性對應的getXXX()方法的名字
                String getMethodName = "get" + firstLetter + fieldName.substring(1);
                
    // 獲得和屬性對應的setXXX()方法的名字
                String setMethodName = "set" + firstLetter + fieldName.substring(1);

                
    // 獲得和屬性對應的getXXX()方法
                Method getMethod = classType.getMethod(getMethodName,
                        new Class[] {});
                
    // 獲得和屬性對應的setXXX()方法,使用filed對象的類型
                Method setMethod = classType.getMethod(setMethodName,
                        
    new Class[] { field.getType() });

                
    // 調用原對象的getXXX()方法:指定調用的對象和方法的參數值列表
                Object value = getMethod.invoke(object, new Object[] {});
                System.out.println(fieldName 
    + ":" + value);
                
    // 調用拷貝對象的setXXX()方法:指定調用的對象和參數值列表(注意必須是Object類型)
                setMethod.invoke(objectCopy, new Object[] { value });
            }


    -------------------------------------------------------------
    生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
    posted on 2008-09-03 16:05 Paul Lin 閱讀(1827) 評論(0)  編輯  收藏 所屬分類: J2SE
    <2008年9月>
    31123456
    78910111213
    14151617181920
    21222324252627
    2829301234
    567891011

    常用鏈接

    留言簿(21)

    隨筆分類

    隨筆檔案

    BlogJava熱點博客

    好友博客

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 成全视成人免费观看在线看 | 亚洲国产精品碰碰| 久久精品国产亚洲AV久| 91精品免费观看| 亚洲精品在线观看视频| 无码人妻一区二区三区免费n鬼沢| 国产亚洲精品激情都市| 青青草97国产精品免费观看| 免费一级做a爰片久久毛片潮喷| 亚洲暴爽av人人爽日日碰| 日韩一品在线播放视频一品免费| 亚洲色大成网站www尤物| 亚洲精品国产国语| 在线看片无码永久免费视频| 亚洲婷婷第一狠人综合精品| 久久精品免费一区二区喷潮| 亚洲爆乳大丰满无码专区| 四虎永久免费观看| 亚欧洲精品在线视频免费观看| 中文字幕专区在线亚洲| 欧洲人成在线免费| 亚洲区视频在线观看| 成人午夜免费福利| 日韩在线一区二区三区免费视频| 奇米影视亚洲春色| 久久永久免费人妻精品下载| 亚洲欧洲日产国码一级毛片| 国产精品无码永久免费888| 亚洲国产成人片在线观看| 日韩精品无码免费一区二区三区 | 99视频精品全部免费观看| 亚洲国产精品成人久久久| 国产日韩一区二区三免费高清| 亚洲处破女AV日韩精品| 99久久久精品免费观看国产| www亚洲精品久久久乳| 亚洲午夜未满十八勿入网站2| 999久久久免费精品播放| 亚洲国产成人精品无码区二本 | 成年女人毛片免费视频| 黄页网站在线视频免费|