ClassLoader.loadClass 和Class.forName的區(qū)別

前言

在討論之前隐轩,首先要明白一個Java類加載到JVM中經(jīng)過的三個步驟

  • 裝載: 查找和導(dǎo)入類或接口的二進(jìn)制數(shù)據(jù)
  • 鏈接: 分別執(zhí)行 校驗(yàn),準(zhǔn)備戳晌,和解析
  • 校驗(yàn): 檢查導(dǎo)入類或接口的二進(jìn)制數(shù)據(jù)的正確性陪拘;
  • 準(zhǔn)備: **給類的靜態(tài)變量分配并初始化存儲空間菜枷; **
  • 解析: 將符號引用轉(zhuǎn)成直接引用;
  • 初始化: 激活類的靜態(tài)變量的初始化Java代碼和靜態(tài)Java代碼塊涮较。

兩者的區(qū)別

對于Class.forName方法來說

   public static Class<?> forName(String name, boolean initialize,
                                   ClassLoader loader)

三個參數(shù)的含義分別是

  • name: 要加載Class的名字
  • initialize: 是否要初始化
  • loader : 指定的classLoader

對于 ClassLoader.loadClass()

protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException

這個方法的兩個參數(shù)

  • name : class的名字
  • resolve : 是否要進(jìn)行鏈接

所以: 通過傳入的參數(shù)可以知道,Class.forName 執(zhí)行之后已經(jīng)對 被加載類的靜態(tài)變量分配完畢了存儲空間稠鼻,而classLoader.loadClass 并沒有一定執(zhí)行完 鏈接這一步.

使用的區(qū)別

當(dāng)你想動態(tài)加載一個類,而這個類又存在靜態(tài)代碼塊或者靜態(tài)變量狂票,而你在加載的時候就想同時初始化這些靜態(tài)代碼塊候齿。這個時候你可能更應(yīng)該偏向于使用Class.forName

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    //
    // Register ourselves with the DriverManager
    //
    static {
        try {
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }
........................省略代碼....................

可以看一個使用,這是一個用戶在嗎闺属,命令行調(diào)用jdbc時的啟動入口

    public static void main(String[] args) throws Exception {
        String jdbcUrl = DEFAULT_URL;

        if ((args.length == 1) && (args[0] != null)) {
            jdbcUrl = args[0];
        }
      //可以看到這里是使用了Class.forName 方法而不是 Classloader.forName()
        Class.forName("com.mysql.jdbc.Driver").newInstance();
`.....

一些小的細(xì)節(jié)

  • ClassLoader.forName方法如果穿入的Classloader對象為null是不會拋出空指針異常的慌盯,而是選擇使用Bootstrap ClassLoader去加載,但是我們知道Bootstrap只加載java core 庫掂器。 so....
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亚皂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子唉匾,更是在濱河造成了極大的恐慌孕讳,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巍膘,死亡現(xiàn)場離奇詭異厂财,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)峡懈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門璃饱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肪康,你說我怎么就攤上這事荚恶×么” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵谒撼,是天一觀的道長食寡。 經(jīng)常有香客問我,道長廓潜,這世上最難降的妖魔是什么抵皱? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮辩蛋,結(jié)果婚禮上呻畸,老公的妹妹穿的比我還像新娘。我一直安慰自己悼院,他們只是感情好伤为,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著据途,像睡著了一般绞愚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上颖医,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天爽醋,我揣著相機(jī)與錄音,去河邊找鬼便脊。 笑死蚂四,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哪痰。 我是一名探鬼主播遂赠,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晌杰!你這毒婦竟也來了跷睦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤肋演,失蹤者是張志新(化名)和其女友劉穎抑诸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爹殊,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜕乡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了梗夸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片层玲。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辛块,到底是詐尸還是另有隱情畔派,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布润绵,位于F島的核電站线椰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏尘盼。R本人自食惡果不足惜士嚎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望悔叽。 院中可真熱鬧,春花似錦爵嗅、人聲如沸娇澎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趟庄。三九已至,卻和暖如春伪很,著一層夾襖步出監(jiān)牢的瞬間戚啥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工锉试, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留猫十,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓呆盖,卻偏偏與公主長得像拖云,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子应又,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容