使用场景:
最近在用spring aop做动态插件的安装,其中一个功能时从远程URL下载所需的jar包,但是安装插件时需要把jar包 动态的加载到虚拟机中,并把Advice class 添加到所拦截的service上。
1.1 URLClassLoader 介绍
URLClassLoader 是AppClassLoader和ExtClassLoader的父类,它既可以从本地 文件系统获取二进制加载类,也可以从远程主机获取文件来加载类。
1.2 URLClassLoader 方法
返回值 | 方法名 | 方法描述 |
---|---|---|
void | addURL(URL url) | 将指定的 URL 添加到 URL 列表中,以便搜索类和资源。 |
URLClassLoader | newInstance(URL[] urls, ClassLoader parent) | 为指定的 URL 和父类加载器创建新 URLClassLoader 实例。 |
URLClassLoader | newInstance(URL[] urls) | 为指定的 URL 和默认的父类加载器创建新 URLClassLoader 实例。 |
URL[] | getURLs() | 返回用于加载类和资源的 URL 搜索路径。 |
Enumeration | findResources(String name) | 返回表示 URL 搜索路径中具有指定名称的所有资源的 URL 枚举。 |
URL | findResource(String name) | 在 URL 搜索路径中查找具有指定名称的资源。 |
1.3 URLClassLoader 动态加载远程jar的代码实现
// 将本地jar文件加载至classloader
URLClassLoader loader = (URLClassLoader) this.getClass().getClassLoader();
URL targetUrl = jarFile.toURL();
boolean isLoader = false;
for (URL url : loader.getURLs()) {
if (url.equals(targetUrl)) {
isLoader = true;
break;
}
}
// 如果没有加载
if (!isLoader) {
Method add = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class });
add.setAccessible(true);
add.invoke(loader, targetUrl);
}