一、Class反射機制
指的是可以於運行時加載,探知和使用編譯期間完全未知的類.
程序在運行狀態中, 可以動態加載一個只有名稱的類, 對於任意一個已經加載的類,都能夠知道這個類的所有屬性和方法; 對於任意一個對象,都能 調用他的任意一個方法和屬性;
加載完類之後, 在堆內存中會產生一個Class類型的對象(一個類只有一個Class對象), 這個對象包含了完整的類的結構信息,而且這個Class
對象 就像一面鏡子,透過這個鏡子看到類的結構,所以被稱之爲:反射
.
每個類被加載進入內存之後,系統就會爲該類生成一個對應的java.lang.Class對象,通過該Class對象就可以訪問到JVM中的這個類.
二、Class對象的獲取
對象的getClass()方法;
類的.class(最安全/性能最好)屬性;
運用Class.forName(String className)動態加載類,className需要時類的全限定名(最常用)
三、創建對象
通過反射來生成對象的方式有兩種:
使用Class對象的newInstance()方法來創建該Class對象對應類的實例(這種方式要求該Class對象的對應類有默認構造器).
先使用Class對象獲取指定的Constructor對象, 再調用Constructor對象的newInstance()方法來創建該Class對象對應類的實例(通過這種方式可 以選擇指定的構造器來創建實例).
四、訪問成員變量
通過Class對象的的getField()方法可以獲取該類所包含的全部或指定的成員變量Filed,Filed提供瞭如下兩組方法來讀取和設置成員變量值.
getXxx(Object obj)
: 獲取obj對象的該成員變量的值, 此處的Xxx對應8中基本類型,如果該成員變量的類型是引用類型, 則取消get後面的Xxx;
setXxx(Object obj,Xxx val): 將obj對象的該成員變量值設置成val值.此處的Xxx對應8種基本類型, 如果該成員類型是引用類型, 則取消set後面的Xxx;
注: getDeclaredXxx方法可以獲取所有的成員變量,無論private/public;