jar暂时不写名

本文介绍了一种通过动态加载JAR文件并从中发现服务实现的方法。具体实现了ServiceLoader接口来查找和加载特定的服务实现类,并使用ConcurrentHashMap缓存已加载的服务。此外,还提供了如何动态添加JAR到类路径的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


    //通过key获取需要的  可以配置在配置文件或者解析jar包存库,解析jar的话注意jar需要特定文件指定解析操作
    private Map<String, WService> services = new ConcurrentHashMap<>();
    public Optional<WService> getWService(String channelCode,String filePath) {
        try {
            //加载新引入的jar
            if(!StringUtils.isEmpty(filePath)){
//                loadJar(filePath);
                loadJar("D:\\jarload\\test.jar");
                //获取新引入的jar的实现类
                ServiceLoader<WService> serviceLoader = ServiceLoader.load(WService.class);
                for (WService wService : serviceLoader) {
                    services.put(wService.getChannelCode(), wService);
                }
            }
        } catch (Exception e) {
            System.err.println(e);
        }
        return services.get(channelCode);
    }

    private static void loadJar(String jarPath) throws MalformedURLException {
        File jarFile = new File(jarPath); // 从URLClassLoader类中获取类所在文件夹的方法,jar也可以认为是一个文件夹
        if (jarFile.exists() == false) {
            System.out.println("jar file not found.");
            return;
        }
        // 获取类加载器的addURL方法,准备动态调用
        Method method = null;
        try {
            method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
        } catch (NoSuchMethodException | SecurityException e1) {
            e1.printStackTrace();
        }
        // 获取方法的访问权限,保存原始值
        boolean accessible = method.isAccessible();
        try {
            // 修改访问权限为可写
            if (accessible == false) {
                method.setAccessible(true);
            }
            // 获取系统类加载器
            URLClassLoader classLoader = (URLClassLoader)ClassLoader.getSystemClassLoader();
            // 获取jar文件的url路径
            java.net.URL url = jarFile.toURI().toURL();
            // jar路径加入到系统url路径里
            method.invoke(classLoader, url);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 回写访问权限
            method.setAccessible(accessible);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值