標籤:method class 儲存 變數 通用 參數 lan bsp 執行個體化
反射庫(reflection library)提供了一個非常豐富且精心設計的工具集,以便編寫能夠動態操縱Java代碼的程式。能夠分析類能力的程式成為反射(reflective)。反射機制的功能極其強大,可以用來:在運行中分析類的能力;在運行中查看對象;實現通用的數組作業碼;利用Method對象,這個對象很像C++中的函數指標。
在程式運行期間,Java運行時系統始終為所有的對象維護一個被稱為運行時的類型標識。這個資訊跟蹤著每個對象所屬的類。虛擬機器利用運行時類型資訊選擇相應的方法執行。然而,可以通過專門的Java類訪問這些資訊。儲存這些資訊的類被稱為Class。Object類中的getClass()方法將會返回一個Class類型的執行個體。
Class是java.lang包中的類,該類的執行個體可以協助程式建立其他類的執行個體或者取得其他類的對象的內部資訊。
使用Class執行個體化一個對象
建立對象最常用的方式就是使用new運算子和類的構造方法,實際上也可以使用Class對象得到某個類的執行個體。步驟如下:
- 使用Class的類方法得到一個和某類(參數className指定的類)相關的Class對象,public static Class forName(String className) throws ClassNotFoundException。上述方法返回一個和參數className指定的類相關的Class對象。如果類在某個包中,className必須帶有包名,例如,className = “java.util.Data”。
- 步驟1中獲得的Class對象調用public Object newInstance() throws InstantiationException, IllegalAccessException方法就可以得到一個className類的對象。
要特別注意的是:使用Class對象調用newInstance()執行個體化一個className類的對象時,className類必須有無參數的構造方法。
擷取類的有關資訊
當一個類被載入且建立對象時,和該類相關的一個類型為Class的對象就會自動建立,任何對象調用getClass()方法都可以擷取和該對象相關的一個Class對象,這個Class對象調用如下的方法可以擷取對象的有關資訊,比如,建立該對象的類的名字、類中的方法名稱、成員變數的名稱等等。
1 import java.lang.reflect.*; 2 import java.util.Date; 3 4 public class Example { 5 public static void main(String[] args) { 6 Date date = new Date(); 7 Class cs = date.getClass(); 8 String className = cs.getName(); 9 Constructor[] con = cs.getDeclaredConstructors();10 Field[] field = cs.getDeclaredFields();11 Method[] method = cs.getDeclaredMethods();12 13 System.out.println("className:" + className);14 System.out.println("class constructors:");15 for (Constructor c : con) {16 System.out.println(c.toString());17 }18 System.out.println("class fields:");19 for (Field f : field) {20 System.out.println(f.toString());21 }22 System.out.println("class methods:");23 for (Method m : method) {24 System.out.println(m.toString());25 }26 }27 }
反射之實現通用的數組作業碼和利用Method暫時沒有用到,暫且不寫……
Java基礎之反射