java URLClassLoader 加载外部jar包中的指定的类

使用场景:最近在用spring aop做动态插件的安装,其中一个功能时从远程URL下载所需的jar包,但是安装插件时需要把jar包 动态的加载到虚拟机中,并把Advice class 添加到所拦截的service上。

1.1 URLClassLoader 介绍

URLClassLoader 是AppClassLoader和ExtClassLoader的父类,它既可以从本地 文件系统获取二进制加载类,也可以从远程主机获取文件来加载类。

URLClassLoader的继承结构

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);
        }

这里写图片描述

猜你喜欢

转载自blog.csdn.net/fd2025/article/details/80538468