一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

JAVA虛擬機加載類的方式解析

 IT民工收藏 2014-04-10

虛擬機加載類的途徑
1、由 new 關(guān)鍵字創(chuàng)建一個類的實例
   在由運行時刻用 new 方法載入
   如:Dog dog = new Dog();
2、調(diào)用 Class.forName() 方法
   通過反射加載類型,并創(chuàng)建對象實例
   如:Class clazz = Class.forName(“Dog”);
       Object dog =clazz.newInstance();
3、調(diào)用某個 ClassLoader 實例的 loadClass() 方法
   通過該 ClassLoader 實例的 loadClass() 方法載入。應(yīng)用程序可以通過繼承 ClassLoader 實現(xiàn)自己的類裝載器。
   如:Class clazz = classLoader.loadClass(“Dog”);
       Object dog =clazz.newInstance();
三者的區(qū)別:

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

 

兩個異常(exception)
靜態(tài)加載的時候如果在運行環(huán)境中找不到要初始化的類,拋出的是NoClassDefFoundError,它在JAVA的異常體系中是一個Error
動態(tài)態(tài)加載的時候如果在運行環(huán)境中找不到要初始化的類,拋出的是ClassNotFoundException,它在JAVA的異常體系中是一個checked異常

 

Class.forName與ClassLoader.loadClass區(qū)別
Class的裝載包括3個步驟:加載(loading),連接(link),初始化(initialize).
Class.forName(className)實際上是調(diào)用Class.forName(className, true, this.getClass().getClassLoader())。第二個參數(shù),是指Class被loading后是不是必須被初始化。
ClassLoader.loadClass(className)實際上調(diào)用的是ClassLoader.loadClass(name, false),第二個參數(shù)指Class是否被link。
Class.forName(className)裝載的class已經(jīng)被初始化,而ClassLoader.loadClass(className)裝載的class還沒有被link。一般情況下,這兩個方法效果一樣,都能裝載Class。但如果程序依賴于Class是否被初始化,就必須用Class.forName(name)了。
例如,在JDBC編程中,??吹竭@樣的用法,Class.forName("com.mysql.jdbc.Driver").
如果換成了getClass().getClassLoader().loadClass("com.mysql.jdbc.Driver"),就不行。
com.mysql.jdbc.Driver的源代碼如下:
// Register ourselves with the DriverManager
static {
    try {
        java.sql.DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
        throw new RuntimeException("Can't register driver!");
    }
}
原來,Driver在static塊中會注冊自己到j(luò)ava.sql.DriverManager。而static塊就是在Class的初始化中被執(zhí)行。
所以這個地方就只能用Class.forName(className)。

 

對于相同的類,JVM最多會載入一次。但如果同一個class文件被不同的ClassLoader載入,那么載入后的兩個類是完全不同的。因為已被加載的類由該類的類加載器實例與該類的全路徑名的組合標(biāo)識。設(shè)有 packagename.A Class ,分別被類加載器 CL1 和 CL2 加載,所以系統(tǒng)中有兩個不同的 java.lang.Class 實例: <CL1, packagename.A> 和 <CL2, packagename.A>。

本文歡迎轉(zhuǎn)載,但請注明作者與出處

作者:流星

出處:http://blog.sina.com.cn/staratsky

虛擬機加載類的途徑
1、由 new 關(guān)鍵字創(chuàng)建一個類的實例
   在由運行時刻用 new 方法載入
   如:Dog dog = new Dog();
2、調(diào)用 Class.forName() 方法
   通過反射加載類型,并創(chuàng)建對象實例
   如:Class clazz = Class.forName(“Dog”);
       Object dog =clazz.newInstance();
3、調(diào)用某個 ClassLoader 實例的 loadClass() 方法
   通過該 ClassLoader 實例的 loadClass() 方法載入。應(yīng)用程序可以通過繼承 ClassLoader 實現(xiàn)自己的類裝載器。
   如:Class clazz = classLoader.loadClass(“Dog”);
       Object dog =clazz.newInstance();
三者的區(qū)別:

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

 

兩個異常(exception)
靜態(tài)加載的時候如果在運行環(huán)境中找不到要初始化的類,拋出的是NoClassDefFoundError,它在JAVA的異常體系中是一個Error
動態(tài)態(tài)加載的時候如果在運行環(huán)境中找不到要初始化的類,拋出的是ClassNotFoundException,它在JAVA的異常體系中是一個checked異常

 

Class.forName與ClassLoader.loadClass區(qū)別
Class的裝載包括3個步驟:加載(loading),連接(link),初始化(initialize).
Class.forName(className)實際上是調(diào)用Class.forName(className, true, this.getClass().getClassLoader())。第二個參數(shù),是指Class被loading后是不是必須被初始化。
ClassLoader.loadClass(className)實際上調(diào)用的是ClassLoader.loadClass(name, false),第二個參數(shù)指Class是否被link。
Class.forName(className)裝載的class已經(jīng)被初始化,而ClassLoader.loadClass(className)裝載的class還沒有被link。一般情況下,這兩個方法效果一樣,都能裝載Class。但如果程序依賴于Class是否被初始化,就必須用Class.forName(name)了。
例如,在JDBC編程中,??吹竭@樣的用法,Class.forName("com.mysql.jdbc.Driver").
如果換成了getClass().getClassLoader().loadClass("com.mysql.jdbc.Driver"),就不行。
com.mysql.jdbc.Driver的源代碼如下:
// Register ourselves with the DriverManager
static {
    try {
        java.sql.DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
        throw new RuntimeException("Can't register driver!");
    }
}
原來,Driver在static塊中會注冊自己到j(luò)ava.sql.DriverManager。而static塊就是在Class的初始化中被執(zhí)行。
所以這個地方就只能用Class.forName(className)。

 

對于相同的類,JVM最多會載入一次。但如果同一個class文件被不同的ClassLoader載入,那么載入后的兩個類是完全不同的。因為已被加載的類由該類的類加載器實例與該類的全路徑名的組合標(biāo)識。設(shè)有 packagename.A Class ,分別被類加載器 CL1 和 CL2 加載,所以系統(tǒng)中有兩個不同的 java.lang.Class 實例: <CL1, packagename.A> 和 <CL2, packagename.A>。

本文歡迎轉(zhuǎn)載,但請注明作者與出處

作者:流星

出處:http://blog.sina.com.cn/staratsky

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    中文字幕日韩一区二区不卡| 99久久国产精品亚洲| 国产日韩久久精品一区| 香港国产三级久久精品三级| 亚洲最新一区二区三区| 激情中文字幕在线观看| 欧美国产在线观看精品| 成人综合网视频在线观看| 日本中文在线不卡视频| 国产一区二区三区av在线| 亚洲欧美日韩综合在线成成| 午夜福利网午夜福利网| 国产一区二区三区免费福利| 国产成人亚洲综合色就色| 特黄大片性高水多欧美一级| 成人午夜激情免费在线| 亚洲二区欧美一区二区| 欧美日韩国产二三四区| 国产一级片内射视频免费播放| 欧美野外在线刺激在线观看| 欧美自拍偷自拍亚洲精品| 91一区国产中文字幕| 欧美日韩精品视频在线| 欧美一区二区三区不卡高清视| 精品久久综合日本欧美| 国产精品午夜性色视频| 国产精品一区二区有码| 内射精品欧美一区二区三区久久久| 欧美欧美日韩综合一区| 亚洲一区二区三在线播放| 人妻精品一区二区三区视频免精| 激情爱爱一区二区三区| 我想看亚洲一级黄色录像| 亚洲av熟女国产一区二区三区站| 亚洲中文字幕剧情在线播放| 欧美日韩黑人免费观看| 偷拍偷窥女厕一区二区视频| 中文字幕人妻av不卡| 色哟哟哟在线观看视频| 老司机亚洲精品一区二区| 伊人国产精选免费观看在线视频|