欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java基礎(chǔ)之自定義類加載器

 更新時(shí)間:2021年05月13日 08:59:57   作者:SmallSweets  
應(yīng)該有很多小伙伴還不了解Java自定義類加載器吧,下文中有對(duì)Java自定義類加載器非常詳細(xì)的描述,還有小伙伴們最喜歡的代碼環(huán)節(jié),需要的朋友可以參考下

一、類加載器關(guān)系

在這里插入圖片描述

自定義類加載器

創(chuàng)建一個(gè)類繼承ClassLoader類,同時(shí)重寫findClass方法,用于判斷當(dāng)前類的class文件是否已被加載

二、基于本地class文件的自定義類加載器

本地class文件路徑

在這里插入圖片描述

自定義類加載器:

//創(chuàng)建自定義加載器類繼承ClassLoader類
public class MyClassLoader extends ClassLoader{
//    包路徑
    private String Path;

//    構(gòu)造方法,用于初始化Path屬性
    public MyClassLoader(String path) {
        this.Path = path;
    }

//    重寫findClass方法,參數(shù)name表示要加載類的全類名(包名.類名)
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        System.out.println("findclass方法執(zhí)行");

//        檢查該類的class文件是否已被加載,如果已加載則返回class文件(字節(jié)碼文件)對(duì)象,如果沒有加載返回null
        Class<?> loadedClass = findLoadedClass(name);
//        如果已加載直接返回該類的class文件(字節(jié)碼文件)對(duì)象
        if (loadedClass != null){
            return loadedClass;
        }

//        字節(jié)數(shù)組,用于存儲(chǔ)class文件的字節(jié)流
        byte[] bytes = null;
        try {
//            獲取class文件的字節(jié)流
            bytes = getBytes(name);
        } catch (Exception e) {
            e.printStackTrace();
        }


        if (bytes != null){
//        如果字節(jié)數(shù)組不為空,則將class文件加載到JVM中
            System.out.println(bytes.length);
//            將class文件加載到JVM中,返回class文件對(duì)象
            Class<?> aClass = this.defineClass(name, bytes, 0, bytes.length);
            return aClass;
        }else {
            throw new ClassNotFoundException();
        }
    }

//    獲取class文件的字節(jié)流
    private byte[] getBytes(String name) throws Exception{
//        拼接class文件路徑 replace(".",File.separator) 表示將全類名中的"."替換為當(dāng)前系統(tǒng)的分隔符,F(xiàn)ile.separator返回當(dāng)前系統(tǒng)的分隔符
        String FileUrl = Path + name.replace(".", File.separator) + ".class";
        byte[] bytes;
//        相當(dāng)于一個(gè)緩存區(qū),動(dòng)態(tài)擴(kuò)容,也就是隨著寫入字節(jié)的增加自動(dòng)擴(kuò)容
        ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
        File file = new File(FileUrl);
//        創(chuàng)建輸入流
        InputStream inputStream = new FileInputStream(file);
        int content;
//        循環(huán)將輸入流中的所有數(shù)據(jù)寫入到緩存區(qū)中
        while ((content = inputStream.read()) != -1){
            arrayOutputStream.write(content);
            arrayOutputStream.flush();
        }
        bytes = arrayOutputStream.toByteArray();
        return bytes;
    }
}

測試類

在這里插入圖片描述
在這里插入圖片描述

三、遇到的問題

在獲取class文件字節(jié)流的getBytes方法中,為什么不將輸入流中的所有數(shù)據(jù)直接寫入到bytes中,而是要先寫入到ByteArrayOutputStream中?如下:

在這里插入圖片描述

現(xiàn)在我們嘗試將數(shù)據(jù)直接寫入到bytes中,如下:

在這里插入圖片描述

但在運(yùn)行時(shí)報(bào)錯(cuò):

Extra bytes at the end of class file com/smallsweets/OutSide

在這里插入圖片描述

這是為什么呢?個(gè)人理解如下:

看報(bào)錯(cuò)提示Extra bytes at the end of:在文件的最后有多余的字節(jié)

查看class文件的大小

在這里插入圖片描述

但是字節(jié)數(shù)組在初始化時(shí)指定的大小是1024,多余位置的字節(jié)是0,所以就出現(xiàn)了多余字節(jié)的情況

解決方法是:我們可以在初始化數(shù)組時(shí)將數(shù)組的大小指定為和class文件相同大小,如下:

在這里插入圖片描述
這樣就可以解決了,雖然可以解決,但如果每次加載類時(shí)都要修改未免有些麻煩,所以這里我們直接使用ByteArrayOutputStream,因?yàn)樗莿?dòng)態(tài)擴(kuò)容的,也就是大小是隨寫入數(shù)據(jù)的多少而動(dòng)態(tài)變化的不會(huì)出現(xiàn)多余字節(jié)的情況

四、基于網(wǎng)絡(luò)(url)class文件的自定義類加載器

class文件路徑

在這里插入圖片描述

自定義類加載器:

public class MyUrlClassLoader extends ClassLoader {
    private String Path;

    public MyUrlClassLoader(String path) {
        this.Path = path;
    }

//    參數(shù)name表示全類名(包名.類名)
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
//        判斷該類的class文件是否已加載,已加載直接返回class文件對(duì)象,沒有加載返回null
        Class<?> loadedClass = this.findLoadedClass(name);
        if (loadedClass != null){
            return  loadedClass;
        }

        byte[] bytes = null;
        try {
//            獲取網(wǎng)絡(luò)class文件的字節(jié)數(shù)組
            bytes = getBytes(Path);
        } catch (Exception e) {
            e.printStackTrace();
        }

//        如果字節(jié)數(shù)組不為空,將class文件加載到JVM中
        if (bytes != null){
//            將class文件加載到JVM中,參數(shù)(全類名,字節(jié)數(shù)組,起始位置,長度)
            Class<?> aClass = this.defineClass(name, bytes, 0, bytes.length);
            return aClass;
        }else {
            throw new ClassNotFoundException();
        }

    }

//    獲取網(wǎng)絡(luò)class文件的字節(jié)流,參數(shù)為class文件的url
    private byte[] getBytes(String fileUrl) throws Exception {
        byte[] bytes;
//        創(chuàng)建url對(duì)象
        URL url = new URL(fileUrl);
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
//        連接url
        httpURLConnection.connect();
//        創(chuàng)建輸入流,獲取網(wǎng)絡(luò)中class文件的字節(jié)流
        InputStream inputStream = httpURLConnection.getInputStream();
//        相當(dāng)于緩存區(qū),動(dòng)態(tài)擴(kuò)容
        ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
        int content;
//        循環(huán)將輸入流中的所有數(shù)據(jù)寫入到緩存區(qū)中
        while ((content = inputStream.read()) != -1){
            arrayOutputStream.write(content);
            arrayOutputStream.flush();
        }
        bytes = arrayOutputStream.toByteArray();
        return bytes;
    }

}

測試類

在這里插入圖片描述
在這里插入圖片描述

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

相關(guān)文章

  • 解決eclipse中maven引用不到已經(jīng)存在maven中jar包的問題

    解決eclipse中maven引用不到已經(jīng)存在maven中jar包的問題

    這篇文章主要介紹了解決eclipse中maven引用不到已經(jīng)存在maven中jar包的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Spring Boot中使用Server-Sent Events (SSE) 實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)推送教程

    Spring Boot中使用Server-Sent Events (SSE) 實(shí)

    Server-Sent Events (SSE) 是HTML5引入的一種輕量級(jí)的服務(wù)器向?yàn)g覽器客戶端單向推送實(shí)時(shí)數(shù)據(jù)的技術(shù),本文主要介紹了Spring Boot中使用Server-Sent Events (SSE) 實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)推送教程,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • java類加載機(jī)制、類加載器、自定義類加載器的案例

    java類加載機(jī)制、類加載器、自定義類加載器的案例

    這篇文章主要介紹了java類加載機(jī)制、類加載器、自定義類加載器的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java如何隨機(jī)生成圖片驗(yàn)證碼

    Java如何隨機(jī)生成圖片驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了Java如何隨機(jī)生成圖片驗(yàn)證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Java?NIO與IO的區(qū)別以及比較

    Java?NIO與IO的區(qū)別以及比較

    這篇文章主要介紹了Java?NIO與IO的區(qū)別以及比較,文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • BiConsumer接口中的方法andThen?accept使用詳解

    BiConsumer接口中的方法andThen?accept使用詳解

    這篇文章主要為大家介紹了BiConsumer接口中的方法andThen?accept使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 三種簡單排序算法(使用java實(shí)現(xiàn))

    三種簡單排序算法(使用java實(shí)現(xiàn))

    下面小編就為大家?guī)硪黄N簡單排序算法(使用java實(shí)現(xiàn))。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-07-07
  • Java實(shí)現(xiàn)遠(yuǎn)程控制技術(shù)完整源代碼分享

    Java實(shí)現(xiàn)遠(yuǎn)程控制技術(shù)完整源代碼分享

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)遠(yuǎn)程控制技術(shù)完整源代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Spring框架之IOC介紹講解

    Spring框架之IOC介紹講解

    IOC-Inversion of Control,即控制反轉(zhuǎn)。它不是什么技術(shù),而是一種設(shè)計(jì)思想。這篇文章將為大家介紹一下Spring控制反轉(zhuǎn)IOC的原理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • spring 如何將配置信息注入靜態(tài)變量的方法

    spring 如何將配置信息注入靜態(tài)變量的方法

    本篇文章主要介紹了spring 如何將配置信息注入靜態(tài)變量的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06

最新評(píng)論