手頭正在做一個項目,在項目中很多地方為了開發的快捷,往往我們總工程師就會要求我們盡量為一組功能相仿的模組寫通用的代碼,這樣可以最大程度的減少工作量。雖然開始寫的通用成都高的,可複用程度高的代碼會很痛苦,幾個演算法的設計會讓人抓狂!但是一旦完成了,對於我個人來說,那是很興奮的,這種興奮,就像當初在學校的時候完成一道理科題目一樣,難以抑制。對於項目組來說,那也是一勞永逸的事情。
最近碰到的是為一組向web service發送資料的需求。發送的資料符合xml規範。這樣一來,對於伺服器端來說,定義這樣的資料的時候,自然會根據需求所定義的schema來產生伺服器端得資料類型。其實說白了,就是一組xml到javabean的映射關係。對於我們用戶端需要訪問該web service的時候,只要根據伺服器端提供的WSDL,利用xfire等工具產生一組映射好的java類,在根據類中提供的方法,產生對應的對象,把對象發送出去即可。如果有大量的web service需要訪問的話,寫一個能夠通用的方法確實是一個很不錯的想法,畢竟重複的設定一些值也是很讓人無奈的事情。
為了達到以上目的,很自然的就想到了java中的反射機制,也只有利用反射機制才能很好的完成這樣的任務。本來我還想跟項目組說,這任務比較重,我需要很長一段時間才能完成,誰想,總工直接說“用反射嘛,很容易的”,被他這麼一說,我原先想著快速利用反射完成任務,接下來的時間就可以舒舒服服過了,一下子成了泡影,哎,還是老老實實工作吧。
以上是一個利用反射的一個情景,通過努力之後,任務完成了,我也想小結一下利用反射時候的認識。物件導向的編程,其實說白了,就是利用對象,完成對象提供的一些服務。有時候,我們也設計對象,為自己,也為別人提供一些便利,但是更多的時候,我們會選擇利用別人設計好的比較成熟的對象來更好的更快捷的完成任務,這才是物件導向的變成,代碼的最大限度的複用。在使用一個對象的時候,無非要做如下工作:1、產生所需對象的執行個體,2、為該對象的某些方法準備所需要的資料,3、利用該對象提供的方法,處理這些資料。
View Code
對於這樣一個操作,用java的反射來實現的話,就應該是這樣的:
View Code
class B{
public static void main(String[] arg){
Class c_a = Class.forName(packageName + "." + "A");
Object obj_a = c_a.newInstance();
Method do_m = c_a.getDeclaredMethod("do",new Class[]{});
//prepare data for the mathod
do_m.invoke(obj_a, new Object[]{});
}
}
原本覺得反射挺麻煩的,其實仔細看,想一想,其實反射也是很自然的。就好在其它的C++的代碼中,如果需要調用DLL的話,也是需要先聲明調用的方法,然後再調用的。反射很類似這種情況。先聲明一個方法
Method m = c_a.getDeclaredMethod("do", new Class[]{});
然後再調用
m.invoke(obj_a, new Object[]{});
反射其實利用起來很簡單,但是卻可以解決很多問題,不可不說這是一個很好的工具。雖然代碼顯得比較多,但是細想之下,其實很也是很自然的事情,並不需要努力去記憶什麼東西。