posts - 297,  comments - 1618,  trackbacks - 0
          一. 反射機制描述
                Java的反射機制允許程序在運行時透過反射API取得任何一個已知名稱的class的內部信息,主要包括屬性名,屬性名的修飾符,方法名,方法返回值,方法修飾符等信息。

          二. Java類反射中的主要方法
               Constructor getConstructor(Class[] params) -- 獲得使用特殊的參數類型的公共構造函數,

               Constructor[] getConstructors() -- 獲得類的所有公共構造函數

               Constructor getDeclaredConstructor(Class[] params) -- 獲得使用特定參數類型的構造函數(與接入級別無關)

               Constructor[] getDeclaredConstructors() -- 獲得類的所有構造函數(與接入級別無關) 

               獲得字段信息的Class 反射調用不同于那些用于接入構造函數的調用,在參數類型數組中使用了字段名:

               Field getField(String name) -- 獲得命名的公共字段

               Field[] getFields() -- 獲得類的所有公共字段

               Field getDeclaredField(String name) -- 獲得類聲明的命名的字段

               Field[] getDeclaredFields() -- 獲得類聲明的所有字段 

               用于獲得方法信息函數:

               Method getMethod(String name, Class[] params) -- 使用特定的參數類型,獲得命名的公共方法

               Method[] getMethods() -- 獲得類的所有公共方法

               Method getDeclaredMethod(String name, Class[] params) -- 使用特寫的參數類型,獲得類聲明的命名的方法

               Method[] getDeclaredMethods() -- 獲得類聲明的所有方法 

          三. Java反射機制應用初探
             
               現在一堆框架搞得人云里霧里的,例如spring等等,大都利用了Java的反射機制,eg. 大名鼎鼎的IOC.昨天晚上閑著沒事的時候,初試了下反射,下面是一個簡單的測試例子:
             

          import java.awt.Button;
          import java.lang.reflect.Method;
          import java.util.Hashtable;

          /**
           * 測試Java的反射機制
           * 
          @author Amigo Xie(xiexingxing1121@126.com)
           * 
          @since 2007/04/20 21:40
           
          */

          public class ReflectionTest {

              
          /**
               * 
          @param args
               
          */

              
          public static void main(String[] args) throws Exception {
                  ReflectionTest reflection 
          = new ReflectionTest();
                  reflection.getNameTest();
                  System.out.println(
          "");
                  reflection.getMethodTest();
              }

              
              
          /**
               * Class的getName()方法測試
               * 
          @throws Exception
               
          */

              
          public void getNameTest() throws Exception {
                  System.out.println(
          "===========begin getNameTest============");
                  String name 
          = "amigo";
                  Class cls 
          = name.getClass();
                  System.out.println(
          "string class name: " + cls.getName());
                  
                  Button btn 
          = new Button();
                  Class btnClass 
          = btn.getClass();
                  System.out.println(
          "button class name: " + btnClass.getName());
                  Class superBtnClass 
          = btnClass.getSuperclass();
                  System.out.println(
          "super button class name: " + superBtnClass.getName());
                  
                  Class clsTest 
          = Class.forName("java.awt.Button");
                  System.out.println(
          "clsTest name: " + clsTest.getName());
                  System.out.println(
          "===========end getNameTest============");
              }

              
              
          /**
               * Class的getMethod()方法測試
               * 
          @throws Exception
               
          */

              
          public void getMethodTest() throws Exception {
                  System.out.println(
          "===========begin getMethodTest==========");
                  Class cls 
          = Class.forName("ReflectionTest");
                  Class ptypes[] 
          = new Class[2];
                  ptypes[
          0= Class.forName("java.lang.String");
                  ptypes[
          1= Class.forName("java.util.Hashtable");
                  Method method 
          = cls.getMethod("testMethod", ptypes);
                  Object args[] 
          = new Object[2];
                  args[
          0= "hello, my dear!";
                  
                  Hashtable ht 
          = new Hashtable();
                  ht.put(
          "name""amigo");
                  args[
          1= ht;
                  
                  String returnStr 
          = (String) method.invoke(new ReflectionTest(), args);
                  System.out.println(
          "returnStr= " + returnStr);
                  System.out.println(
          "===========end getMethodTest==========");
              }


              
          public String testMethod(String str, Hashtable ht) throws Exception {
                  String returnStr 
          = "return str";
                  System.out.println(
          "begin testMethod invoked");
                  System.out.println(
          "str= " + str);
                  System.out.println(
          "name= " + (String) ht.get("name"));
                  System.out.println(
          "end testMethod invoked");
                  
          return returnStr;
              }

          }


                 控制臺輸出如下:
                 ===========begin getNameTest============
                 string class name: java.lang.String
                 button class name: java.awt.Button
                 super button class name: java.awt.Component
                 clsTest name: java.awt.Button
                 ===========end getNameTest============

                 ===========begin getMethodTest==========
                 begin testMethod invoked......
                 str= hello, my dear!
                 name= amigo
                 end testMethod invoked......
                 returnStr= return str
                 ===========end getMethodTest==========
          參考文章:
                《侯捷觀點--Java反射機制》
                《java反射機制》  http://hi.baidu.com/javatwt/blog/item/9aeffd13ddfb65025aaf53d4.html
               

          posted on 2007-04-21 11:45 阿蜜果 閱讀(11660) 評論(7)  編輯  收藏 所屬分類: Java


          FeedBack:
          # re: Java反射機制學習筆記(一)[未登錄]
          2007-04-21 15:12 | αβγ
          出差,也不忘寫blog啊  回復  更多評論
            
          # re: Java反射機制學習筆記(一)
          2007-04-25 10:33 | 王凌華
          加油!  回復  更多評論
            
          # re: Java反射機制學習筆記(一)
          2007-07-09 19:54 | lcs
          這個似乎用處不怎么大,寫的不深刻,只是皮毛  回復  更多評論
            
          # re: Java反射機制學習筆記(一)
          2007-08-19 19:26 | tanl
          太膚淺了,就是演示了一下它的方法!  回復  更多評論
            
          # re: Java反射機制學習筆記(一)[未登錄]
          2007-08-19 22:40 | jack
          文章mm自己寫的嗎  回復  更多評論
            
          # re: Java反射機制學習筆記(一)
          2008-09-19 11:35 | x-pei
          恩 這只是些基本的語法!
          沒有什么 ~  回復  更多評論
            
          # re: Java反射機制學習筆記(一)
          2010-01-27 21:52 | IBM-dr.smith
          這樣的代碼一點意義也沒有,看了反而有副作用!  回復  更多評論
            
          <2007年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

                生活將我們磨圓,是為了讓我們滾得更遠——“圓”來如此。
                我的作品:
                玩轉Axure RP  (2015年12月出版)
                

                Power Designer系統分析與建模實戰  (2015年7月出版)
                
               Struts2+Hibernate3+Spring2   (2010年5月出版)
               

          留言簿(263)

          隨筆分類

          隨筆檔案

          文章分類

          相冊

          關注blog

          積分與排名

          • 積分 - 2296321
          • 排名 - 3

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 交口县| 通化县| 朝阳区| 衡山县| 双鸭山市| 镇江市| 湘潭县| 恭城| 德州市| 花莲县| 周宁县| 旬阳县| 唐山市| 长岭县| 四子王旗| 辽源市| 德兴市| 甘孜县| 张掖市| 永昌县| 剑河县| 施甸县| 道孚县| 泸溪县| 通河县| 集安市| 甘洛县| 施甸县| 宁都县| 朝阳县| 商南县| 盱眙县| 桂平市| 南昌市| 钦州市| 平利县| 东港市| 鹤壁市| 工布江达县| 十堰市| 礼泉县|