Skip to content

Methods by Reflection

十一月 9, 2006

昨晚為了拼今天要交的 CSPA 程式作業待在 Lab 趕程式, 直到今天凌晨五點多才收工, 眼看天都快亮了, 倒在休息區整個睡死…

直到剛剛醒來準備來收看 11 點的亞洲大賽, 我發現整個身體與心臟有種快成仙的感覺, 就是那種玩刺激遊戲像坐雲宵飛車的那種快心悸的死掉感覺, 猜想大概是因為睡不太好的關係吧, 睡 Lab 本來就不能期待可以睡得很舒服就是了.

回正題, 昨天在做的是 Event-Driven Programming, 而我的設計是會動態的 call 指定的 event function, 因為得有個機制可以讓我這麼做:

假如我有一個 String Object:

String call_method = “Test1″;

以及準備要呼叫的 method:

public void Test1()
{
System.out.println(“test1″);
}

首先感謝 Sigma 學長的指導, 讓我知道 java.lang.reflect 這東西可以幫我達成, 有兩個動作:

先用 java.lang.Class.getMethod(String name, Class[] parameterTypes) 把字串 call_method 傳進去, 會回傳 Test1() 這個 Method 物件, 將回傳的這個 Method 物件呼叫 invoke() 便順利呼叫 Test1() 了

原本在版上貼完我的經驗後, Yanni 學長丟出這個更方便的玩意: Commons BeanUtils, 這東西的 MethodUtils 可以一次就搞定我要做的事, 當然 PropertyUtils 也是不得不看的好東西啊… :p

最後則是再一次感謝 Sigma 學長的調教, 實在好感動啊!!

java.lang.reflect是jdk 1.3之後提供的強力套件
用它可以做
查表式的函式呼叫(用空間換取時間, 在C/C++時我很喜歡用, 現在還是很喜歡)

以他為基礎的tool跟framework很多, 我知道且有名的
Jakarta BeanUtils – 幫你把這類工作包起來
Struts – 除了用BeanUtils之外, 自己也用
DispatchAction

SpringFramework
他是完全發揮到淋漓盡致
他自己也有BeanUtils的package~~也是做包裝reflect用

其他如 Tomcat, JBoss,……都有借助 Reflect 的地方

AOP 最早的實作方式也是用 Reflect + Proxy 實作(SpringFramework也提供)

另外還有一個用途就是拿來檢查版本
比如說某個framework 1.0沒有method1, 但1.1有
就可以透過這個方式來判斷
我在改寫 Struts 的 Servlet 時有用來判斷 1.1 還是 1.2

不過 1.3 時, reflect 的效能不好, 1.4 之後有改進

對 AOP 沒有兩位學長那麼熟悉, 我曉得那是成為高手的必備條件, 努力再努力.

廣告
No comments yet

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

%d 位部落客按了讚: