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

 

假設咱們有一個hello.jar文件,裏面有一個Util類,咱們但願在運行期調將這個jar包放入到咱們運行環境而且調用裏面的Util.getVersion方法。怎麼實現?java

在java中,咱們的類都是經過ClassLoader來加載的,同時ClassLoader具備層級關係,當某個類找不到時,它會去他的父類加載器去尋找,若是依然找不到,就拋出ClassNotFoundException了。web

爲了動態加載hello.jar裏面的Util類,咱們須要將這個jar包放入到咱們的類加載器中去,而後再獲取裏面的類。以下面的代碼。服務器

複製代碼

// 位於hello.jarpackage 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包便可。this

動態加載jar包,須要用到java.net.URLClassLoader這個類,它能夠指定一個路徑將jar包或者classes文件加載到類空間。加載完畢後,直接調用loadClass就能夠加載指定的類,而後經過反射生成實例或者調用方法便可。url

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

運行程序,咱們就能夠看到程序正常輸出:.net

java version: 1.7.0_03
相關文章
相關標籤/搜索