最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java classloader類加載器的實(shí)現(xiàn)

 更新時(shí)間:2025年12月23日 08:35:17   作者:醒過(guò)來(lái)摸魚  
本文介紹了Java類加載器的繼承性和隔離性,類加載器分為四個(gè)層級(jí):Bootstrap、Extension、System和Plugin,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

Classloader的繼承性。

第一級(jí)叫做bootstrap classloader,加載JDK自帶的類,也就是${JAVA_HOME}/lib下的類。
第二級(jí)叫做extern classloader,加載${JAVA_HOME}/lib/ext下的類。
第三級(jí)叫做system classloader,加載第三方的類,就是classpath里其他的類。
第四級(jí)及更高級(jí)叫做plugin classloader,是用戶自己寫的classloader或者new出來(lái)的URLClassLoader,加載classpath以外的類。在tomcat容器中,每個(gè)應(yīng)用里的WEB-INF/lib和WEB-INF/classes就是通過(guò)tomcat自定義的classloader去加載的。

Classloader的隔離性。

  1. 父級(jí)不能調(diào)用子級(jí)的類。
    比如extern classloader里加載的class不能調(diào)用system classloader加載的類,會(huì)拋class not found異常.
  2. 同一級(jí)不同classloader加載的類不能互相調(diào)用。
    比如有兩個(gè)plugin classloader, loader A 與loader B。loader A加載的類class A不能調(diào)用loader B加載的類 class B.
  3. 無(wú)法獲取bootstrap Classloader的實(shí)例。
    System.out.println(String.class.getClassLoader());
    這個(gè)輸出結(jié)果是null
    總而言之,只能child加載的類調(diào)用parent加載的類。兄弟及各種遠(yuǎn)房親戚不能互相調(diào)用。

簡(jiǎn)單的plugin classloader

直接使用jdk自帶的url classloader就可以加載任意jar包里的類了。
比如以下代碼

final URL url = new URL("file:///C:/Users/Ryan/IdeaProjects/learn/classloader/heap-1.0.jar");
final URLClassLoader classLoader = new URLClassLoader(new URL[]{url});
final Class<?> heapClass = classLoader.loadClass("net.cloudsun.head.SmallHeap");
final Constructor<?> constructor = heapClass.getConstructor();
final Object o = constructor.newInstance();

final Method add = heapClass.getMethod("add", java.lang.Comparable.class);
for (int i = 0; i < 10; i++) {
    add.invoke(o, -i);
}
System.out.println(o);

自定義classloader

當(dāng)不能提供url時(shí),比如jar包不在磁盤里,也不在http服務(wù)器上,或者jar包是加密的。只能自己寫classloader進(jìn)行類的加載。
自己寫classloader最終必須繼承Classloader類。因?yàn)檫@個(gè)類有個(gè)保護(hù)型且final的defineClass方法,傳入類的字節(jié)碼,也就是byte[],就可以加載一個(gè)類。也就是說(shuō)class的來(lái)源是byte[]。
比如

public class JarClassLoader extends ClassLoader {

    @Override
    public Class<?> loadClass(String name) throws ClassNotFoundException {
        // 從jar包里取byte數(shù)組
        try {
            JarFile jarFile = new JarFile("heap-1.0.jar");
            final byte[] bytes = JarUtils.getByte(jarFile, name);
            if (bytes == null) {
                return super.loadClass(name);
            }
            return super.defineClass(name, bytes, 0, bytes.length);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}

上述代碼的JarUtils是一個(gè)自己寫的工具類。

public static byte[] getByte(JarFile jarFile, String className) {

    final String entry = className.replace('.', '/') + ".class";
    final JarEntry jarEntry = jarFile.getJarEntry(entry);
    if (jarEntry == null) {
        return null;
    }
    try (final InputStream inputStream = jarFile.getInputStream(jarEntry)) {
        return IOUtils.toByteArray(inputStream);
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }

}

當(dāng)然這個(gè)classloader寫得并不規(guī)范。因?yàn)橐?guī)范的classloader首先要調(diào)用parent classloader去加載類,如果parent加載失敗,再自己加載,而且加載的class必須緩存起來(lái)。因?yàn)閺淖止?jié)碼加載class的開(kāi)銷是非常巨大的。當(dāng)然前三級(jí)JDK自帶的的classloader都會(huì)在loadClass方法里去檢查class是否已經(jīng)加載。所以只要每級(jí)class loader優(yōu)先調(diào)用parent classloader,就可以自動(dòng)實(shí)現(xiàn)class的緩存。

到此這篇關(guān)于Java classloader類加載器的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java classloader內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java微信小程序oss圖片上傳的實(shí)現(xiàn)方法

    Java微信小程序oss圖片上傳的實(shí)現(xiàn)方法

    這篇文章主要介紹了Java微信小程序oss圖片上傳的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 簡(jiǎn)述Java編程之關(guān)系操作符

    簡(jiǎn)述Java編程之關(guān)系操作符

    這篇文章主要介紹了簡(jiǎn)述Java編程中的關(guān)系操作符,同時(shí)對(duì)比較類作了簡(jiǎn)單介紹,需要的朋友可以參考下
    2017-09-09
  • SpringBoot 多Profile使用與切換方式

    SpringBoot 多Profile使用與切換方式

    這篇文章主要介紹了SpringBoot 多Profile使用與切換方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • SpringBoot打印詳細(xì)啟動(dòng)異常信息

    SpringBoot打印詳細(xì)啟動(dòng)異常信息

    這篇文章主要介紹了SpringBoot打印詳細(xì)啟動(dòng)異常信息,本文包含了詳細(xì)的過(guò)程解析與案例,概要的說(shuō)明了如何去使用打印啟動(dòng)異常信息,需要的朋友可以參考下
    2021-06-06
  • Java中Collections.sort的使用

    Java中Collections.sort的使用

    本文主要介紹了Java中Collections.sort的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Struts2的配置文件方法小結(jié)

    Struts2的配置文件方法小結(jié)

    最近正在學(xué)習(xí)Struts2,在配置文件中遇到好多標(biāo)簽,各種意義不同。下面這篇文章就來(lái)給大家介紹關(guān)于Struts2配置文件的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • Java中三種簡(jiǎn)單注解介紹和代碼實(shí)例

    Java中三種簡(jiǎn)單注解介紹和代碼實(shí)例

    這篇文章主要介紹了Java中三種簡(jiǎn)單注解介紹和代碼實(shí)例,本文講解了Override注解、Deprecated注解、Suppresswarnings注解、元注解等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • java與JSON數(shù)據(jù)的轉(zhuǎn)換實(shí)例詳解

    java與JSON數(shù)據(jù)的轉(zhuǎn)換實(shí)例詳解

    這篇文章主要介紹了java與JSON數(shù)據(jù)的轉(zhuǎn)換實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • JavaAgent原理及實(shí)踐分享

    JavaAgent原理及實(shí)踐分享

    這篇文章主要介紹了JavaAgent原理及實(shí)踐,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Idea中Springboot熱部署無(wú)效問(wèn)題解決

    Idea中Springboot熱部署無(wú)效問(wèn)題解決

    這篇文章主要介紹了Idea中Springboot熱部署無(wú)效問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11

最新評(píng)論

仪陇县| 横峰县| 皮山县| 沽源县| 鄢陵县| 万全县| 宜州市| 喀什市| 乌鲁木齐市| 西藏| 丰顺县| 大竹县| 静海县| 如东县| 鄯善县| 铁岭县| 和平县| 那坡县| 都江堰市| 石景山区| 平湖市| 平潭县| 安溪县| 长葛市| 蓬莱市| 怀安县| 开平市| 驻马店市| 吉木萨尔县| 乐山市| 泌阳县| 浮山县| 秭归县| 海晏县| 内乡县| 越西县| 繁昌县| 南阳市| 紫金县| 揭西县| 大关县|