反射的概念:
在Java中的反射機制是指在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;
對於任意一個類,都能調用它的任意一個方法;
這種動態獲取信息以及動態調用對象的功能成為Java語言的反射機制。
我們寫的類在載入內存的時候jvm虛擬機是怎么識別到底哪個是變量,哪個是方法,哪個是修飾符的呢?
因為java中的Class也是一個對象,那么有對象就有對應的類,當在硬盤中的時候是一個文件,當載入內存的時候就可以看成一個對象。這個Class對象的成員變量就是 Field、Constructor、Method、Modifier,值就是變量名、修飾符、方法名。類里面的field、constructor、method、modifier,在java.lang.reflect中都有這些方法、變量等對應的類,其中有類Field、類Constructor、類Method、類Modifier,有對象就有對應的類。例如,我們寫了一個動物類,成員變量有毛色、體重,毛色=紅色、體重=70,毛色的值是紅色,體重的值是70,這個很好理解。那么,在jvm虛擬機中,java.lang.Class就相當於這個動物類,成員變量就是Field、Constructor、Method、Modifier,值就是變量名、修飾符、方法名。因此我們就可以通過Class對象去獲得成員變量的值,也就是我們想要得到的變量名、修飾符列表、方法名等等,這就是反射的基本原理。
Java反射機制能夠實現的功能:
1 在運行時判斷任意一個對象所屬的類
2 在運行時構造任意一個類的對象
3 在運行時判斷任意一個類所具有的方法和屬性
4 在運行時調用任意一個對象的方法
5 生成動態代理
在動態代理中應用的反射最多,可也說有動態代理必有反射。
獲取Class類對象有三種方法,這個對象是java.lang.Class類的,
1 使用Class類的forName()靜態方法
Class c1 = Class.forName("Employee");//"類的全路徑"
2 調用某個類的class屬性來獲取該類對應的Class對象
每個類都默認具備Class屬性,這個屬性保存的是它對應那個Class對象的內存地址
Class c2 = Employee.class;
3 調用某個對象的getClass()方法
java中任何一個對象都有getClass()方法,e是運行時類
Employee e = new Employee();
Class c3 = e.getClass();
Class類對象獲取了之后,我們就可以通過對象獲取想要得到的屬性,方法,以及對屬性的操作等等
這些方法就不一一列出來了,寫出來沒有什么意義,在Java手冊中都有說明,多翻翻手冊總是有用處的.