Posted on 2009-02-16 19:07
啥都寫點 閱讀(225)
評論(1) 編輯 收藏
在Java運行時環境中,對于任意一個類,能否知道這個類有哪些屬性和方法?對于任意一個對象,能否調用它的任意一個方法?答案是肯定的。這種動態獲取類的信息以及動態調用對象的方法的功能來自于Java語言的反射(Reflection)機制。
反射機制主要提供了以下功能:
1、在運行時判斷任意一個對象所屬的類。
2、在運行時構造任意一個類的對象
3、在運行時判斷任意一個類所具有的成員變量和方法。
4、在運行時調用任意一個對象的方法。
Reflection是Java被視為動態(或準動態)語言的一個關鍵性質。這個機制允許程序在運行時透過ReflectionAPIs取得任何一個已知名稱的class的內部信息,包括其modifiers(諸如public,static等等)、superclass(例如Object)、實現之interfaces(例如
Serializable),也包括fields和methods的所有信息,并可于運行時改變fields內容或調用methods。
一般而言,開發者社群說道動態語言,大致認同的一個定義是:“程序運行時,允許改變程序結構或變量類型,這種語言稱為動態語言”。從這個觀點看,Perl,Python,Ruby是動態語言,C++,Java,
C#不是動態語言。盡管在這樣的定義與分類下Java不是動態語言,它卻有著一個非常突出的動態相關機制:Reflection。這個字的意思是“反射、印象、倒影”,用在Java身上指的是我們可以于運行時加載、探知、使用編譯期間完全未知的classes。換句話說,Java程序可以加載一個運行時才得知名稱的class,獲悉其完整構造(但不包括methods定義),并聲成其對象實體、或對其fields設置、或喚起其methods。這種“看透class”的能力(the
ability of the program to examine itself)被稱為introspection(內省、內觀、反?。?。
在JDK中,主要由以下類來實現Java反射機制,這些類都位于java.lang.reflect包中。
--
學海無涯