1. java 的類裝載系統:
在java虛擬機中有兩種類裝載器: 啓動類裝載器 和 自定義類裝載器。 前者是jvm的一部分,後者是java程序的一部分。不一樣的類裝載器放在不懂得命名空間中。java
類轉載子系統涉及java的其它幾個部分,及來自lang庫的類。好比自定義的類裝載器必須派生自java.lang.ClassLoader。 ClassLoader中定義的方法爲程序提供了訪問類裝載器機制的接口。
其實在java內置的類裝載器有三種。
1)Bootstrap ClassLoader 此加載器採用c++編寫,通常開發中不多見。
2)Extension ClassLoader 用來進行擴展類的加載,通常對應的是jre\lib\ext目錄中的類
c++
工做流程裝載:查找並裝載類型的二進制數據。
連接: 驗證 準備 解析
初始化 : 把類變量初始化爲正確的初始值。
類的ClassLoader 的 protected final Class findSystemClass(String name);接受一個字符串做爲參數,
2. 反射射就是一面鏡子 可以在鏡子中看到 這個類中的「全部」的東西
有三種能夠在程序中獲得class對象的方式:
第一中就是 在編譯時不知道其類名但在運行期能夠獲得該類名 使用class類的forname()靜態方法得到class對象 如: class c=class.forname("獲得的類名的全名 包括屬於的工程,包");
第二中就是當咱們獲得該類的一個對象咱們就能夠直接用該對象的getclass();方法獲得給類的class對象如:
class c=對象名.getclass();
第三種就是咱們在運行 前就已經知道其類名的 能夠直接使用類名.class來獲得一個給類的class對象
如: class c = 類名.class;
3. 反射裝載過程:
jvm
對於Class。forName() 來說主要有兩種形式:
static Class forName (String className) Returns the Class object associated with the class or interface with the given string name.
static Class forName (String name, boolean initialize, ClassLoader loader) Returns the Class object associated with the class or interface with the given string name, using the given class loader.
三參數的解釋 若是initalize設爲true,類型會在forName()方法返回前鏈接並初始化;若是是false,類型會被加載,可能會鏈接可是不會被明確的初始化。若是loader 爲null則使用默認的加載器,也能夠選用自定義的加載器。兩個forName()方法都返回Class實例的引用,表明被裝載的類型。若是不能裝載拋出ClassNotFoundException。
若是使用用戶自定義的裝載器,那麼loadClass()方法就要調用
Class loadClass (String name) Loads the class with the specified binary name .
protected Class loadClass (String name, boolean resolve) Loads the class with the specified binary name .
這兩個方法來裝載新的請求的類型,若是找不到,會拋出ClassNotFoundException 異常。
類裝載的反向查找是去已經加載的類庫中尋找權限定名的過程,若是沒有就從新動態擴展,(就像一個map的映射方式去找的。)前提是類已經編譯成class的字節碼文件。
orm