URLClassLoader ucl = new URLClassLoader(new URL[] { new File("D:\\aaa\\abc.jar").toURI()
.toURL() }, Application.class.getClassLoader());
Class<?> cls = ucl.loadClass("com.test.Test");
Object o = cls.newInstance();
以上仅仅是解决了abc.jar没有调用其他jar包(同样不再CLASSPATH中)的情况,否则就需要修改系统类加载器,估计默认调用的都是系统类加载器,办法如下:
static URLClassLoader sysloader = (URLClassLoader) ClassLoader
.getSystemClassLoader();
static Class sysclass = URLClassLoader.class;
static Method method;
public static void addURL(URL u) throws IOException {
try {
if (method == null) {
Class[] cs = new Class[] { URL.class };
method = sysclass.getDeclaredMethod("addURL", cs);
method.setAccessible(true);
}
method.invoke(sysloader, new Object[] { u });
} catch (Exception ex) {
ex.printStackTrace();
}
}
但比较奇怪的是不能增加目录,只能一个jar一个jar的增加,比如
addURL(new File("D:\\aaa\\aaa.jar").toURL());
addURL(new File("D:\\aaa\\bbb.jar").toURL());
不知道为什么?
加载类和加载动态库是同样的道理,都得找到最终的那个文件,前者主要由虚拟机搞定,不管怎样,他们都有一些搜索路径,只要我们想办法改变其搜索路径,问题就解决了。
.toURL() }, Application.class.getClassLoader());
Class<?> cls = ucl.loadClass("com.test.Test");
Object o = cls.newInstance();
以上仅仅是解决了abc.jar没有调用其他jar包(同样不再CLASSPATH中)的情况,否则就需要修改系统类加载器,估计默认调用的都是系统类加载器,办法如下:
static URLClassLoader sysloader = (URLClassLoader) ClassLoader
.getSystemClassLoader();
static Class sysclass = URLClassLoader.class;
static Method method;
public static void addURL(URL u) throws IOException {
try {
if (method == null) {
Class[] cs = new Class[] { URL.class };
method = sysclass.getDeclaredMethod("addURL", cs);
method.setAccessible(true);
}
method.invoke(sysloader, new Object[] { u });
} catch (Exception ex) {
ex.printStackTrace();
}
}
但比较奇怪的是不能增加目录,只能一个jar一个jar的增加,比如
addURL(new File("D:\\aaa\\aaa.jar").toURL());
addURL(new File("D:\\aaa\\bbb.jar").toURL());
不知道为什么?
加载类和加载动态库是同样的道理,都得找到最终的那个文件,前者主要由虚拟机搞定,不管怎样,他们都有一些搜索路径,只要我们想办法改变其搜索路径,问题就解决了。