java程式執行過程中動態載入jar包
阿新 • • 發佈:2019-02-04
最近做一個遠端介面測試系統,遇到了動態載入jar包的問題,如將使用者上傳的jar包動態載入後呼叫遠端介面的方法,特將例子記錄下來以便查詢。
package cn.baokx.test_addjar; import java.io.File; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; public class Main { public static void main(String[] args) throws NoSuchMethodException, SecurityException, MalformedURLException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { loadJar(Main.class.getResource("/lib/test.jar").getPath()); Class clazz = Class.forName("cn.baokx.testjar.Demo1"); Object obj = clazz.newInstance(); Method method = clazz.getMethod("fun1"); method.invoke(obj); } public static void loadJar(String jarPath) { File jarFile = new File(jarPath); // 從URLClassLoader類中獲取類所在資料夾的方法,jar也可以認為是一個資料夾 Method method = null; try { method = URLClassLoader.class .getDeclaredMethod("addURL", URL.class); } catch (NoSuchMethodException | SecurityException e1) { e1.printStackTrace(); } // 獲取方法的訪問許可權以便寫回 boolean accessible = method.isAccessible(); try { method.setAccessible(true); // 獲取系統類載入器 URLClassLoader classLoader = (URLClassLoader) ClassLoader .getSystemClassLoader(); URL url = jarFile.toURI().toURL(); method.invoke(classLoader, url); } catch (Exception e) { e.printStackTrace(); } finally { method.setAccessible(accessible); } } }