類加載的幾種方式

概念

類加載器(ClassLoader),顧名思義,即加載類的東西。在我們使用一個類之前,JVM需要先將該類的字節碼文件(.class文件)從磁盤、網絡或其他來源加載到內存中,並對字節碼進行解析生成對應的Class對象,這就是類加載器的功能。我們可以利用類加載器,實現類的動態加載。

Class的裝載包括3個步驟:加載(loading),連接(link),初始化(initialize)
加載:查詢並加載類的二進制數據.class
連接:1)、驗證:確保被加載的類的正確性;
     2)、準備:爲類的靜態變量分配內存,並將其初始化爲默認值;
     3)、解析:把類中的符號引用轉化爲直接引用
初始化:爲類的靜態變量賦予正確的初始值
類加載的方式有幾種?區別是什麼?
加載方式:
1、由new關鍵字創建一個類的實例
    在由運行時刻用 new 方法載入
    例:Person person = new Person();
2、使用Class.forName()
    通過反射加載類型,並創建對象實例
    例:Class clazz = Class.forName("Person");
        Object person =clazz.newInstance();
3、使用某個ClassLoader實例的loadClass()方法
    通過該 ClassLoader 實例的 loadClass() 方法載入。應用程序可以通過繼承 ClassLoader 實現自己的類裝載器。
    例:Class clazz = classLoader.loadClass("Person");
        Object person =clazz.newInstance();
區別:

1和2使用的類加載器是相同的,都是當前類加載器(即:this.getClass.getClassLoader)。
3由用戶指定類加載器。如果需要在當前類路徑以外尋找類,則只能採用第3種方式。即第3種方式加載的類與當前類分屬不同的命名空間。

1是靜態加載,2、3是動態加載

異常(exception)

靜態加載的時候如果在運行環境中找不到要初始化的類,拋出的是NoClassDefFoundError,它在JAVA的異常體系中是一個Error;
動態態加載的時候如果在運行環境中找不到要初始化的類,拋出的是ClassNotFoundException,它在JAVA的異常體系中是一個checked異常。

從JVM的角度看,我們使用關鍵字new創建一個類的時候,這個類可以沒有被加載。但是使用Class對象的newInstance()方法的時候,就必須保證:1.這個類已經加載;2.這個類已經連接了。

new關鍵字和newInstance()方法的區別:
newInstance:弱類型,低效率,只能調用無參構造;
new:強類型,相對高效,能調用任何Public構造。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章