java URLClassLoader 載入外部jar包中的指定的類

笑看風華發表於2018-06-01

使用場景:最近在用spring aop做動態外掛的安裝,其中一個功能時從遠端URL下載所需的jar包,但是安裝外掛時需要把jar包 動態的載入到虛擬機器中,並把Advice class 新增到所攔截的service上。

1.1 URLClassLoader 介紹

URLClassLoader 是AppClassLoader和ExtClassLoader的父類,它既可以從本地 檔案系統獲取二進位制載入類,也可以從遠端主機獲取檔案來載入類。

URLClassLoader的繼承結構

1.2 URLClassLoader 方法

返回值 方法名 方法描述
void addURL(URL url) 將指定的 URL 新增到 URL 列表中,以便搜尋類和資源。
URLClassLoader newInstance(URL[] urls, ClassLoader parent) 為指定的 URL 和父類載入器建立新 URLClassLoader 例項。
URLClassLoader newInstance(URL[] urls) 為指定的 URL 和預設的父類載入器建立新 URLClassLoader 例項。
URL[] getURLs() 返回用於載入類和資源的 URL 搜尋路徑。
Enumeration findResources(String name) 返回表示 URL 搜尋路徑中具有指定名稱的所有資源的 URL 列舉。
URL findResource(String name) 在 URL 搜尋路徑中查詢具有指定名稱的資源。

1.3 URLClassLoader 動態載入遠端jar的程式碼實現

    // 將本地jar檔案載入至classloader
        URLClassLoader loader = (URLClassLoader) this.getClass().getClassLoader();
        URL targetUrl = jarFile.toURL();

        boolean isLoader = false;
        for (URL url : loader.getURLs()) {
            if (url.equals(targetUrl)) {
                isLoader = true;
                break;
            }
        }
        // 如果沒有載入
        if (!isLoader) {
            Method add = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class });
            add.setAccessible(true);
            add.invoke(loader, targetUrl);
        }

這裡寫圖片描述

相關文章