官术网_书友最值得收藏!

  • Java組件設計
  • 孔德生編著
  • 528字
  • 2018-12-29 19:21:04

3.2 反射

我們通常寫的程序都是靜態的代碼,比如:調用class A示例的put方法:

                  A a = new A();
                  a.put(“Hello!”);

第二行,a.put就是一種靜態的寫法。在編譯階段,就完成對a類型的解析,對a是否具有put方法進行了判斷。如果a對象沒有put方法,則編譯不通過。

可是,在一些特殊情況下,我們需要在運行時動態地對一個對象的指定方法進行調用,比如我們想寫一個通用的函數,傳入一個對象,把這個對象的屬性名和屬性值都打印出來,這就需要使用反射技術。

反射,是在JDK 1.5引入的,JDK 1.4以及以前的版本不支持。

在java.lang.reflect包中,定義了一些類,用于運行時動態解析和調用對象,常用的如下:

● Constructor :構造函數

● Field :成員變量

● Method :成員方法

● Type :類型

另外,java.lang包中,Class類是非常值得重視的,通常用它來動態創建對象。對于聲明了無參數的構造函數,或者有默認構造函數的類,動態創建一個對象的代碼如下:

         Class cls = Class.forName(“com.test.ServiceImpl”);
        Object obj = cls.newInstance();

這樣,一個com.test.ServiceImpl類的實例就創建出來了。

假如ServiceImpl類有個registerUser方法,實現用戶注冊功能,如下:

        public int registerUser(String userName, String passwd);

如何動態調用呢?代碼示例如下:

         // 動態加載類
         Class cls = Class.forName("com.test.ServiceImpl");
        // 動態創建對象
         Object obj = cls.newInstance();
        // 獲取相應的方法
         Method method = cls.getDeclaredMethod("registerUser", String.class, String.class);
        String userName = "zhangsan";
        String passwd = "hello123";
        // 動態調用對象的方法
         Object result = method.invoke(obj, new Object[] {userName, passwd});
        // 強制類型轉換,獲取函數調用的返回值
         int userId = ((Integer)result).intValue();
        System.out.println("userId=" + userId);

以上代碼,需用try { } 包括起來,捕獲異常。

主站蜘蛛池模板: 璧山县| 怀柔区| 绵阳市| 新宁县| 株洲县| 贵阳市| 江安县| 裕民县| 酒泉市| 巴中市| 博爱县| 东宁县| 灌南县| 葫芦岛市| 荔波县| 许昌市| 陕西省| 潜山县| 九寨沟县| 阜康市| 东宁县| 洪泽县| 永丰县| 竹溪县| 福海县| 温泉县| 兴业县| 菏泽市| 遵义市| 道孚县| 石楼县| 岐山县| 大新县| 中阳县| 贞丰县| 沙湾县| 原平市| 青岛市| 耒阳市| 卓尼县| 大埔区|