public class ClassLoaderOrClassForName{ public static void main(String[] args) throws ClassNotFoundException{ ClassLoader loader = ClassLoader.getSystemClassLoader(); Class<?> loadClass = loader.loadClass("TestDiff"); System.out.println("Load Class : " + loadClass.getName());
System.out.println("------"); Class<?> forName = Class.forName("TestDiff"); System.out.println("Class for Name : " + forName.getName()); } } class TestDiff{ static { System.out.println("Static Method"); } }
output:
Load Class : TestDiff
------
Static Method
Class for Name : TestDiffjava
Class.forName方法將類的.class文件加載到jvm的同時會執行static方法塊中的內容。安全
classLoader只會將類的.class文件加載到jvm中,不會執行static中的內容,只有在調用newInstance()方法調用構造函數,建立類的對象。jvm
JVM類加載機制分爲五個部分:加載,驗證,準備,解析,初始化。函數
加載階段會在內存中生成一個表明這個類的Class對象,做爲方法區這個類的各類數據的入口spa
驗證階段主要是爲了確保Class文件的字節流中包含的信息是否符合當前虛擬機的要求,而且不會危害jvm自身的安全設計
準備階段是正式爲類變量分配內存並設計類變量的初始值階段,即在方法區中分配這些變量所使用的內存空間3d
解析階段是指虛擬機將常量池中的符號飲用替換爲直接應用的過程,符號引用就是class文件中的CONSTANT_Class_info,CONSTANT_Field_info,CONSTANT_Method_infocode
初始化階段是類加載最後一個階段。初始化階段是執行類構造器<client>方法的過程。<client>方法是由編譯器自動收集類中的類變量的賦值操做和靜態語句塊中的語句合併而成。虛擬機會保證<client>方法執行前,父類的<client>方法已經執行完畢。對象
JVM提供了3種類加載器blog
Bootstrap ClassLoader:負責加載JAVA_HOME\lib目錄中的,或經過Xbootclasspath參數指定路徑中的,且被虛擬機承認的類
Extension ClassLoader:負責加載JAVA_HOME\lib\ext目錄中的,或經過java.ext.dirs系統變量指定路徑中的類庫
Application ClassLoader:負責加載用戶路徑上的類庫