- 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 { } 包括起來,捕獲異常。
推薦閱讀
- 輕松學C語言
- 21天學通JavaScript
- Deep Learning Quick Reference
- Go Machine Learning Projects
- 協作機器人技術及應用
- Cloud Analytics with Microsoft Azure
- Getting Started with Containerization
- 大數據技術入門(第2版)
- Google App Inventor
- Visual Basic從初學到精通
- 機器人編程實戰
- 可編程序控制器應用實訓(三菱機型)
- Learn CloudFormation
- Azure PowerShell Quick Start Guide
- Linux嵌入式系統開發