公司最近项目需要实现后续支持上传新的算子,并执行新的算子中的方法,需要用到动态加载jar
在本站找了一下,找到了想要结果,先记录一下:
首先创建一个测试类Calculator.java内有加减乘除四则运算方法,然后需要一个动态加载jar包的方法:
public static void loadJar(String jarPath) {
File jarFile = new File(jarPath);
Method method = null;
try {
//本来不知道为什么要用反射,看了下源码,发现这个addURL是protected方法
method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
} catch (Exception 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);
}
}
main方法中进行测试:
public static void main(String[] args) {
String path = "D:\\Calculator.jar";
loadJar(path);
Class<?> aClass = null;
try {
aClass = Class.forName("com.zhanvie.clazz.Calculator");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
Object instance = aClass.newInstance();
//调用加法运算
Object obj = aClass.getDeclaredMethod("plus", int.class,int.class).invoke(instance, 5,2);
System.out.println(obj);
} catch (Exception e) {
e.printStackTrace();
}
}
以上方法运行结果为7,说明动态加载成功了