類加載器與Class類

類加載器分類

類加載器負責根據類的全限定名將class文件加載到JVM內存,生成Class類的對象。它分爲如下幾種類型:java

  1. Bootstrap Classloader
    由C++所寫,在JVM啓動後初始化,負責加載%JAVA_HOME%/jre/lib,-Xbootclasspath參數指定的路徑以及%JAVA_HOME%/jre/classes中的類
  2. ExtClassLoader
    是sun.misc.Launcher的內部類,繼承自java.net.URLClassLoader->java.security.SecureClassLoader->java.lang.ClassLoader,在rt.jar中,由Bootstrap Classloader加載,負責加載%JAVA_HOME%/jre/lib/ext和java.ext.dirs系統變量指定路徑中的類。parent ClassLoader爲null(由於Bootstrap Classloader並非由java實現的)。
  3. AppClassLoader
    也是sun.misc.Launcher的內部類,繼承自java.net.URLClassLoader,負責加載來自在命令java中的-classpath或者java.class.path系統屬性或者CLASSPATH系統屬性所指定的路徑中的類。其parent ClassLoader爲ExtClassLoader,且是咱們自定義類默認的類加載器。

類加載過程

雙親委派機制:若是一個類未加載,那麼必須先由其父加載器(Bootstrap Classloader能夠認爲是ExtClassLoader父加載器)嘗試加載,若是父加載器在其路徑內找不到該類才由子加載器加載。能夠防止核心類被外來類覆蓋。具體的源碼分析能夠參見深刻理解Java類加載器(ClassLoader)
下面是結合源碼,畫出的利用AppClassLoader查找類的流程圖:數組

clipboard.png

Class類

咱們一般寫的用class(首字母c小寫)定義的類,表徵了java虛擬機裏對象的類型(java是強類型語言),但同時這些類又都是java.lang.Class(首字母C大寫)的對象,經過AppClassLoader加載進虛擬機內存方法區。每一個類都對應一個獨一無二的Class對象,包括Java基本類型、void關鍵字及數組(全部同一維度和類型的數組擁有一樣的Class,數組的長度不作考慮。對應Class的名字表示爲維度和類型。好比一個整型數據的Class名爲「[I」,字節型三維數組Class名爲「[[[B」,兩維對象數組Class名爲「[[Ljava.lang.Object」)。獲得Class對象的方法有三種:源碼分析

MyObject foo = New MyObject();
Class c = foo.getClass();

Class c = Class.ForName("MyObject");

Class c = MyObject.class;
相關文章
相關標籤/搜索