動態添加jar包並調用jar包里面的方法


 

假設我們有一個hello.jar文件,里面有一個Util類,我們希望在運行期調將這個jar包放入到我們運行環境並且調用里面的Util.getVersion方法。怎么實現?

在java中,我們的類都是通過ClassLoader來加載的,同時ClassLoader具有層級關系,當某個類找不到時,它會去他的父類加載器去尋找,如果依然找不到,就拋出ClassNotFoundException了。

為了動態加載hello.jar里面的Util類,我們需要將這個jar包放入到我們的類加載器中去,然后再獲取里面的類。如下面的代碼。

// 位於hello.jar
package com.flyingzl;

public class Util {

    public static void getVersion(){
        
        System.out.println("java version: " + System.getProperty("java.version"));
    }
    
}

 

import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;


public class Main {
    public static void main(String[] args) {
        
        URL[] urls = new URL[] {};
        MyClassLoader classLoader = new MyClassLoader(urls, null);
        
        try {
            classLoader.addJar(new File("c:/hello.jar").toURI().toURL());
            Class<?> clazz = classLoader.loadClass("com.flyingzl.Util");
            Method method = clazz.getDeclaredMethod("getVersion");
            method.invoke(null);
            classLoader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    static class MyClassLoader extends URLClassLoader {

        public MyClassLoader(URL[] urls) {
            super(urls);
        }

        public MyClassLoader(URL[] urls, ClassLoader parent) {
            super(urls, parent);
        }

        public void addJar(URL url) {
            this.addURL(url);
        }

    }

}

注意:這里僅僅是為了展示如何動態加載jar包,代碼寫得很粗,生產代碼需要有更完善的異常處理。我們只關心如何動態加載jar包即可。

動態加載jar包,需要用到java.net.URLClassLoader這個類,它可以指定一個路徑將jar包或者classes文件加載到類空間。加載完畢后,直接調用loadClass就可以加載指定的類,然后通過反射生成實例或者調用方法即可。

其實,Tomcat等服務器也利用了此思路,比如每一個web應用啟動時,它都會自動加載其下的lib文件夾下的jar包。

運行程序,我們就可以看到程序正常輸出:

java version: 1.7.0_03

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM