標籤:java之反射
一、類的載入
當程式要使用某個類時,如果該類還沒有被載入到記憶體中,則系統會通過載入、串連、初始化三步來實現對這個類進行初始化。
載入:就是指將class檔案讀入到記憶體中,並為之建立一個Class對象。任何類被使用的時候,系統都會建立一個Class對象。
串連:1)驗證 是否有正確的內部結構,並和其他類協調一致 2)準備 負責為類的靜態成員分配記憶體,並設定預設初始化值 3)解析 將類的位元據中的符號引用替換為直接引用。
初始化:就是進行屬性初始化、構造初始化等等。
二、類的初始化時機
1.建立類的執行個體
2.訪問類的靜態變數,或者為靜態變數賦值
3.訪問類的靜態方法
4.使用反射方式來強化自建立某個類或者介面對應的Class對象
5.初始化某個類的子類
6.直接使用java.exe命令來運行某個朱磊
三、類載入器
負責將.class檔案載入到記憶體中,並為之產生對應的Class對象。
雖然我們不需要關係類的載入機制,但是瞭解這個機制,我們就能更好的理解程式的運行。
類載入器的組成:
根類載入器:BootStrap ClassLoader,也稱為引導類載入器,負責java核心類的載入,比如System、String等。在JDK中JRE的lib目錄下rt.jar檔案中。
擴充類載入器:Extension ClassLoader,負責JRE的擴充目錄中jar包的載入。在JDK中JRE的lib目錄中的ext目錄。
系統類別載入器:System ClassLoader,負責在JVM啟動時載入來自java命令的class檔案,以及classpath環境變數所指定的jar包和路徑。
通過上面的描述,我們知道我們常用的東西的載入都是由誰來完成的,到目前為止,我們已經知道把class檔案載入到記憶體了,那麼,如果我們僅僅站在這些class檔案的角度,我們如果來使用這些class檔案的內容呢?這就是反射
四、反射
java反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態擷取的資訊以及動態調用對象的方法的功能被稱為java語言的反射機制。
要想解剖一個類,必須先擷取到該類的位元組碼檔案對象。而解剖使用的就是Class類中的方法,所以先要擷取到每一個位元組碼檔案對應的Class類型的對象。
反射擷取class檔案對象的三種方式
package cn7;/** * 反射:就是通過class檔案對象,去使用該檔案中的成員變數,構造方法,成員方法。 * * 要想這樣使用,首先你必須得到class檔案鍍錫,其實也就是得到Class類的對象。 * Class類: * 成員變數 Field * 構造方法 Constructor * 成員方法 Method * 擷取class檔案對象的方式: * 1.Object類的getClass()方法 * 2.資料類型的靜態屬性class * 3.Class類中的靜態方法forName(String className) * * 一般我們在開發中使用的是第三種,因為它傳入的是一個字串,而不是一個具體的類名,這樣我們就可以把這樣的字串配置到設定檔中。 */publicclass ReflectDemo { publicstaticvoid main(String[] args) throws Exception { //方式1 Person p = new Person(); Class<? extends Person> c = p.getClass(); Person p2 = new Person(); Class<? extends Person> c2 = p2.getClass(); System.out.println(p == p2);//false System.out.println(c==c2);//true //方式2 Class<? extends Person> c3 = Person.class; System.out.println(c2==c3);//true //方式3 Class<?> c4 = Class.forName("cn7.Person"); System.out.println(c == c4);//true }}
本文出自 “11831428” 部落格,請務必保留此出處http://11841428.blog.51cto.com/11831428/1877463
java之反射