反射
反射庫提供了一個豐富的工具集,用于編寫能夠動態(tài)操縱Java代碼的程序,。
能夠分析類能力的程序稱為反射,。
反射機制可以用來:
- 在運行時分析類的能力。
- 在運行時查看對象
- 實現通用的數組操作代碼
- 利用Method對象,,這個對象很像C 中的函數指針
Class類
在程序運行的時候,,Java運行時系統(tǒng)會給所有的對象維護一個運行時的類型標識。虛擬機利用運行時類型信息選擇響應的方法執(zhí)行,。
類似于C 中的RTTI運行時類型識別:程序能夠使用基類的指針或引用來檢查著這些指針或引用所指的對象的實際派生類型,。
C 是一種靜態(tài)類型語言。其數據類型是在編譯期就確定的,,不能在運行時更改,。然而由于多態(tài)性的要求,C 中的指針或引用本身的類型,,可能與它實際代表的類型不一致,。這時我們需要將一個多態(tài)指針轉換為其實際指向對象的類型,就需要知道運行時的類型信息,,這就產生了運行時類型識別的要求,。
和Java相比,C 要想獲得運行時類型信息,,只能通過RTTI機制,,并且C 最終生成的代碼是直接與機器相關的。
Java的運行時類型識別,,就是通過反射機制來獲取類的基本信息(接口,、父類、方法,、屬性,、Annotation等),而且Java中還提供了一個關鍵字,,可以在運行時判斷一個類是不是另一個類的子類或者是該類的對象,,Java可以生成字節(jié)碼文件,再由JVM(Java虛擬機)加載運行,,字節(jié)碼文件中可以含有類的信息,。
保存這些信息的類被稱為Class。Object中的getClass()方法將會返回一個Class類型的實例。
System.out.println(a.getClass().getName());
如果類在一個包里,,包的名字也會作為類的一部分:
Random generator =new Random();
Class cl=generator.getClass();//class java.util.Random
String name = cl.getName();//java.util.Random
虛擬機為每個類型管理一個Class對象,。因此,可以利用=運算符實現兩個類對象比較的操作,。
例如:if(e.getClass() == Employee.class)
還有一個很有用的方法newlnstance(),,可以用來動態(tài)地創(chuàng)建一個類的實例。
例如:e.getClass().newInstance();
創(chuàng)建了一個與e具有相同類類型的實例,。newInstance方法調用默認的構造器,。如果沒有默認的構造器,就會拋出異常,。
將forName與newlnstance配合起來使用,,可以根據存儲在字符串中的類名創(chuàng)建一個對象。
String s="java.util.Randon",;
0bject m=Class.forName(s).newInstance();
利用反射分析類的能力
java.lang.reflect包中有三個類:Field(域),、Method(方法)、Constructor(構造器)
三個類都有:
- getName()方法,,返回項目的名稱,。
- getModifiers()方法,將返回一個整形數值,。用于描述public,static等修飾符的使用情況,。可以利用Modifier類的靜態(tài)方法isPublic,、isFinal來對返回的整形數值分析判斷,,并且可以利用Modifier.toString()將修飾符打印出來。
Field有:getType方法,,返回所描述域所屬類型的Class對象,。
Method有:報告返回類型和參數的方法。
Constructor有:報告參數的方法,。
來源:https://www./content-1-628401.html
|