java的反射和它的類加載機制

1. java 的類裝載系統: html

在java虛擬機中有兩種類裝載器: 啓動類裝載器 和 自定義類裝載器。 前者是jvm的一部分,後者是java程序的一部分。不一樣的類裝載器放在不懂得命名空間中。 java

類轉載子系統涉及java的其它幾個部分,及來自lang庫的類。好比自定義的類裝載器必須派生自java.lang.ClassLoader。 ClassLoader中定義的方法爲程序提供了訪問類裝載器機制的接口。 c++


其實在java內置的類裝載器有三種。 api

1Bootstrap ClassLoader 此加載器採用c++編寫,通常開發中不多見。 oracle

2Extension ClassLoader 用來進行擴展類的加載,通常對應的是jre\lib\ext目錄中的類 jvm

3AppClassLoader 加載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.
三參數的解釋 若是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的字節碼文件。

相關文章
相關標籤/搜索