1. java 的類裝載系統: html
在java虛擬機中有兩種類裝載器: 啓動類裝載器 和 自定義類裝載器。 前者是jvm的一部分,後者是java程序的一部分。不一樣的類裝載器放在不懂得命名空間中。 java
類轉載子系統涉及java的其它幾個部分,及來自lang庫的類。好比自定義的類裝載器必須派生自java.lang.ClassLoader。 ClassLoader中定義的方法爲程序提供了訪問類裝載器機制的接口。 c++
其實在java內置的類裝載器有三種。 api
1)Bootstrap ClassLoader 此加載器採用c++編寫,通常開發中不多見。 oracle
2)Extension ClassLoader 用來進行擴展類的加載,通常對應的是jre\lib\ext目錄中的類 jvm
3)AppClassLoader 加載classpath指定的類,是最經常使用的加載器。同時也是java中默認的加載器。 spa
工做流程 裝載:查找並裝載類型的二進制數據。 orm
連接: 驗證 準備 解析
htm
初始化 : 把類變量初始化爲正確的初始值。
對象
類的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. 反射裝載過程:
除了系統類,擴展庫和classpath的自定義的裝載,java還支持動態擴展,包括運行時決定使用的類型,裝載,使用它們。經過反射的java.lang.Class 的forName()方法,或者用戶自定義的loadClass()方法,均可以自動擴展java程序。
對於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.
|
兩個forName()方法都返回Class實例的引用,表明被裝載的類型。若是不能裝載拋出ClassNotFoundException。
若是使用用戶自定義的裝載器,那麼loadClass()方法就要調用
Class<?> | loadClass(String name) |
protected Class<?> | loadClass(String name, boolean resolve) |
類裝載的反向查找是去已經加載的類庫中尋找權限定名的過程,若是沒有就從新動態擴展,(就像一個map的映射方式去找的。)前提是類已經編譯成class的字節碼文件。