中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Class.forName和classloader加載類有什么不同

發布時間:2021-07-11 14:47:06 來源:億速云 閱讀:146 作者:Leah 欄目:大數據

今天就跟大家聊聊有關Class.forName和classloader加載類有什么不同,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

一、類加載機制

Class.forName和classloader加載類有什么不同

往細了看大致分為5個階段:

(1)加載:java類運行時候會生成一個class字節碼文件,加載的過程就是去我們的操作系統尋找這個class文件。

(2)鏈接:這個過程就是把class文件加載到java虛擬機。

(3)初始化:在虛擬機中根據class文件進行初始化。

(4)使用:這個過程大家都明白。

(5)卸載:使用完了,java虛擬機進行清理。

對于class.forName和classloader來說針對的就是第一個過程,也就是加載過程。不過這倆雖然有一定的相似性,但是區別還是挺大的。

二 分析 Class.forName()和ClassLoader.loadClass

我們使用代碼,先看看如何使用。注意包的范圍,避免加載不了。

第一步:定義User類

第二步:測試

我們在上面的test方法中,使用了兩個加載方法。現在我們測試一下:

是不感覺有點區別。現在是先給出一個大體的使用,下面我們分析一下他們的區別。

二、區別

1、class.forName

class.forName()前者除了將類的.class文件加載到jvm中之外,還會對類進行解釋,執行類中的static塊。注意這里的靜態塊指的是在類初始化時的一些數據。但是classloader卻沒有,想要弄清楚這個原因,還是直接到源碼中看看。

Class.forName和classloader加載類有什么不同

在這個源碼中我們會發現,其實底層真正實現的是forName0方法,那這幾個參數又是什么意思呢?

(1)className:表示我們要加載的類名

(2)true:指Class被加載后是不是必須被初始化。 不初始化就是不執行static的代碼即靜態代碼,在這里默認為true,也就是默認實現類的初始化。

(3)ClassLoader.getClassLoader(caller):表示類加載器,到這你會發現forNanme其實也是使用的ClassLoader類加載器加載的。

(4)caller:指定類加載器。

Class.forName(className)方法,內部實際調用的方法是  Class.forName(className,true,classloader);

第2個boolean參數表示類是否需要初始化,  Class.forName(className)默認是需要初始化。

一旦初始化,就會觸發目標對象的 static塊代碼執行,static參數也也會被再次初始化。

2、classloader

在上面的案例中我們發現,classloader并沒有初始化靜態塊,原因最好還是到源碼中看。

首先我們先進入到loadclass方法中的源碼。

public Class<?> loadClass(String name)
    throws ClassNotFoundException {
    return loadClass(name, false);
}

這一步看起來還看不明白,沒關系這里真正實現的是內部的loadclass,我們再跟進去看看。

Class.forName和classloader加載類有什么不同

這個才是真正實現的方法,在這里的步驟其實很簡單,大致流程是先判斷class是否已經被加載,如果被加載了那就重新加載,如果沒有加載那就使用雙親委派原則加載。加載的時候并沒有指定是否要進行初始化。

所以現在他們的區別基本上很少,總結一下:

(1)class.forName()除了將類的.class文件加載到jvm中之外,還會對類進行解釋,執行類中的static塊。當然還可以指定是否執行靜態塊。

(2)classLoader只干一件事情,就是將.class文件加載到jvm中,不會執行static中的內容,只有在newInstance才會去執行static塊。

三  數據庫鏈接為什么使用Class.forName(className)

static {
    try {
        java.sql.DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
        throw new RuntimeException("Can't register driver!");
    }
}

看完上述內容,你們對Class.forName和classloader加載類有什么不同有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

绥滨县| 泌阳县| 桓台县| 沈阳市| 太康县| 常山县| 榆树市| 临潭县| 昌邑市| 滁州市| 固原市| 万安县| 青冈县| 名山县| 珲春市| 会泽县| 化德县| 卫辉市| 从化市| 永清县| 开原市| 肇源县| 崇义县| 永城市| 宜章县| 梅州市| 三门峡市| 凤凰县| 渝北区| 饶平县| 中山市| 盐亭县| 江源县| 工布江达县| 泸溪县| 伊金霍洛旗| 法库县| 盐源县| 宝清县| 墨竹工卡县| 余江县|