程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java反射機制系列(三)例子分析

java反射機制系列(三)例子分析

編輯:關於JAVA

上一篇中,通過例子我們知道了如何利用反射機制創建對象,獲得類變量和調用方法等。創建對象的語句是 Class cla = Class.forName(type);  Object obj = cla.newInstance(); 這裡newInstance()實際上是使用了該類的默認無參構造方法。如果我們要調用其它的構造方法就要稍微復雜一點。比如我們要創建一個StringBuffer對象,用new 操作符應該是StringBuffer br = new StringBuffer("example");用反射機制則要有以下步驟。

首先,獲得StringBuffer類的描述。

Class cla = Class.forName("java.lang.StringBuffer");

其次,要創建參數類型數組Class[] 。

Class[] paraTypes = new Class[1];paraTypes[0]=String.class;

然後,通過cla 和 paraTypes 獲得Constructor 對象。

Constructor constructor = cla.getConstructor(paraTypes);

接著,創建傳入的參數列表Object[]。

Object[] paraLists = new Object[1]; paraLists[0]="color";

最後,得到我們所要得對象。Object obj = constructor.newInstance(paraLists);

如果我們paraTypes及paraLists設為null或長度為0,就可以用上述步驟調用StringBuffer的無參構造方法。類似地,我們可以調用對象中的有參方法。比如我們做如下操作br.insert(4, 'u');用反射機制實現如下。

Class[] paratypes = new Class[]{int.class,char.class};
Method method = cla.getMethod("insert", paratypes);
Object[] paralists = new Object[]{4,'u'};
method.invoke(obj, paralists);

反射機制給予我們運行時才確定對象類型的便利,然而它也有顯著的缺點。

1,代碼笨拙冗長。比如本來一句br.insert(4, 'u');可以解決的問題現在要用到四句。

2,損失了編譯時類型檢查的好處。這使得你要對付更多的異常。

3,性能損失。用反射機制運行的時間更久。

<<Effective Java >>中給出的建議是“普通應用不應在運行時刻以映像方式訪問對象,只是在很有限的情況下使用“。那麼在什麼地方會用到反射機制呢。已有的較熟悉應用是我們的IDE及一些框架。比如eclipse,編程時ctrl+space彈出的建議就是用到反射機制。比如Spring讀取配置文件後生成對應的對象。還有RPC系統也會用到。對於一般的應用軟件,你可以在工廠方法中用到它。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved