JVM-Java類加載

類的生命周期:

  1. 加載(Loading):找Class文件
  2. 驗證(Verification):驗證格式螺戳,依賴
  3. 準備(Preparation):靜態(tài)字段醋旦,方法表
  4. 解析(Resolution):符號解析為引用
  5. 初始化(Initialization):構(gòu)造器、靜態(tài)變量賦值咒劲、靜態(tài)代碼塊
  6. 使用(Using)
  7. 卸載(Unloading)
類的生命周期

類的初始化時機

  1. 當虛擬機啟動時顷蟆,初始化用戶指定的主類,就是啟動執(zhí)行的 main 方法所在的類;
  2. 當遇到用以新建目標類實例的 new 指令時缎患,初始化 new 指令的目標類慕的,就是 new 一個類的時候要初始化;
  3. 當遇到調(diào)用靜態(tài)方法的指令時,初始化該靜態(tài)方法所在的類;
  4. 當遇到訪問靜態(tài)字段的指令時挤渔,初始化該靜態(tài)字段所在的類;
  5. 子類的初始化會觸發(fā)父類的初始化;
  6. 如果一個接口定義了 default 方法,那么直接實現(xiàn)或者間接實現(xiàn)該接口的類的初始化风题, 會觸發(fā)該接口的初始化;
  7. 使用反射 API 對某個類進行反射調(diào)用時判导,初始化這個類,其實跟前面一樣沛硅,反射調(diào)用 要么是已經(jīng)有實例了眼刃,要么是靜態(tài)方法,都需要初始化;
  8. 當初次調(diào)用 MethodHandle 實例時摇肌,初始化該 MethodHandle 指向的方法所在的 類擂红。

MethodHandle 是什么?https://blog.csdn.net/ShuSheng0007/article/details/107066856

不會初始化(可能會加載)

  1. 通過子類引用父類的靜態(tài)字段围小,只會觸發(fā)父類的初始化昵骤,而不會觸發(fā)子類的初始化树碱。
  2. 定義對象數(shù)組,不會觸發(fā)該類的初始化变秦。
  3. 常量在編譯期間會存入調(diào)用類的常量池中成榜,本質(zhì)上并沒有直接引用定義常量的類,不 會觸發(fā)定義常量所在的類蹦玫。
  4. 通過類名獲取 Class 對象赎婚,不會觸發(fā)類的初始化,Hello.class 不會讓 Hello 類初始 化樱溉。
  5. 通過 Class.forName 加載指定類時挣输,如果指定參數(shù) initialize 為 false 時,也不會觸 發(fā)類初始化福贞,其實這個參數(shù)是告訴虛擬機歧焦,是否要對類進行初始化。Class.forName (“jvm.Hello”)默認會加載 Hello 類肚医。
  6. 通過 ClassLoader 默認的 loadClass 方法绢馍,也不會觸發(fā)初始化動作(加載了,但是 不初始化)肠套。

類加載器:

類加載查找路徑
類加載器繼承關系

類加載器三大特點:

  1. 雙親委派模型:如果一個類加載器收到了類加載的請求舰涌,首先不會自己去嘗試加載這個類,而是把這個請求委派給雙親加載器去完成你稚,每一個層次的類加載器都是如此瓷耙。只有當父類加載器反饋自己無法完成這個加載請求時(它的搜索范圍內(nèi)沒有找到所需的類時),子加載器才會嘗試自己完成加載刁赖。
  2. 負責依賴:加載類的同時要將他依賴的類搁痛,父類,接口等也要加載
  3. 緩存加載:類加載器加載過一次宇弛,便會緩存下來鸡典,之后可以直接獲取到

如何顯示當前ClassLoader加載了哪些jar包?

public class JvmClassLoaderPrintPath {

    public static void main(String[] args) {
        URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
        System.out.println("啟動類加載器");
        for (URL url : urls) {
            System.out.println(" --> " + url.toExternalForm());
        }
        printClassLoader("擴展類加載器", JvmClassLoaderPrintPath.class.getClassLoader().getParent());
        printClassLoader("應用類加載器", JvmClassLoaderPrintPath.class.getClassLoader());
    }

    public static void printClassLoader(String name, ClassLoader CL) {
        if (CL != null) {
            System.out.println(name + " ClassLoader -> " + CL.toString());
            printUrlForClassLoader(CL);
        } else {
            System.out.println(name + " ClassLoader -> null");
        }
    }

    public static void printUrlForClassLoader(ClassLoader CL) {
        Object ucp = insightField(CL, "ucp");
        Object path = insightField(ucp, "path");
        ArrayList ps = (ArrayList) path;
        for (Object p : ps) {
            System.out.println(" --> " + p.toString());
        }
    }

    private static Object insightField(Object obj, String fName) {
        try{
            Field f = null;
            if (obj instanceof URLClassLoader) {
                f = URLClassLoader.class.getDeclaredField(fName);
            } else {
                f = obj.getClass().getDeclaredField(fName);
            }
            f.setAccessible(true);
            return f.get(obj);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

}

添加引用類的幾種方式:

1枪芒、放到 JDK 的 lib/ext 下彻况,或者-Djava.ext.dirs
2、 java –cp/classpath 或者 class 文件放到當前路徑
3舅踪、自定義 ClassLoader 加載
4纽甘、拿到當前執(zhí)行類的 ClassLoader,反射調(diào)用 addUrl 方法添加 Jar 或路徑(JDK9 無效)抽碌。

4悍赢、代碼
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子左权,更是在濱河造成了極大的恐慌皮胡,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涮总,死亡現(xiàn)場離奇詭異胸囱,居然都是意外死亡,警方通過查閱死者的電腦和手機瀑梗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門烹笔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抛丽,你說我怎么就攤上這事谤职。” “怎么了亿鲜?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵允蜈,是天一觀的道長。 經(jīng)常有香客問我蒿柳,道長饶套,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任垒探,我火速辦了婚禮妓蛮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘圾叼。我一直安慰自己蛤克,他們只是感情好,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布夷蚊。 她就那樣靜靜地躺著构挤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惕鼓。 梳的紋絲不亂的頭發(fā)上筋现,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音呜笑,去河邊找鬼夫否。 笑死,一個胖子當著我的面吹牛叫胁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汞幢,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼驼鹅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起输钩,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤豺型,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后买乃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姻氨,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年剪验,在試婚紗的時候發(fā)現(xiàn)自己被綠了肴焊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡功戚,死狀恐怖娶眷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情啸臀,我是刑警寧澤届宠,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站乘粒,受9級特大地震影響豌注,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜灯萍,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一轧铁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧竟稳,春花似錦属桦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至诊笤,卻和暖如春系谐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背讨跟。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工纪他, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晾匠。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓茶袒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凉馆。 傳聞我的和親對象是個殘疾皇子薪寓,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

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