假设咱们有一个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