百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

利用ClasserLoader来实现jar包加载并调用里面的方法

liuian 2025-01-07 14:15 64 浏览

1.ClasserLoader介绍?

classloader顾名思义,即是类加载。虚拟机把描述类的数据从class字节码文件加载到内存,并对数据进行检验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。了解java的类加载机制,可以快速解决运行时的各种加载问题并快速定位其背后的本质原因,也是解决疑难杂症的利器。因此学好类加载原理也至关重要。

内置类加载器

JVM 中内置了三个重要的ClassLoader

  1. BootstrapClassLoader(启动类加载器):最顶层的加载类,由 C++实现,通常表示为 null,并且没有父级,主要用来加载 JDK 内部的核心类库( %JAVA_HOME%/lib目录下的 rt.jarresources.jarcharsets.jar等 jar 包和类)以及被 -Xbootclasspath参数指定的路径下的所有类。
  2. ExtensionClassLoader(扩展类加载器):主要负责加载 %JRE_HOME%/lib/ext 目录下的 jar 包和类以及被 java.ext.dirs 系统变量所指定的路径下的所有类。
  3. AppClassLoader(应用程序类加载器):面向我们用户的加载器,负责加载当前应用 classpath 下的所有 jar 包和类。

除了这三种类加载器之外,用户还可以加入自定义的类加载器来进行拓展,以满足自己的特殊需求。就比如说,我们可以对 Java 类的字节码(.class文件)进行加密,加载时再利用自定义的类加载器对其解密。

2.代码工程

实验目标

实现加载外部jar包,并调用其中类方法

JarLoader

package com.et;

import java.net.URL;
import java.net.URLClassLoader;
import java.lang.reflect.Method;
import java.io.File;

public class JarLoader {
    private URLClassLoader urlClassLoader;

    // load JAR file
    public void loadJar(String jarFilePath) throws Exception {
        File jarFile = new File(jarFilePath);
        URL jarUrl = jarFile.toURI().toURL();
        urlClassLoader = new URLClassLoader(new URL[]{jarUrl}, this.getClass().getClassLoader());
        System.out.println("JAR Loaded: " + jarFilePath);
    }

    //load class from  JAR and invoke method
    public void invokeClassMethod(String className, String methodName) throws Exception {
        if (urlClassLoader != null) {
            Class<?> loadedClass = urlClassLoader.loadClass(className);
            Method method = loadedClass.getDeclaredMethod(methodName);
            method.invoke(loadedClass.newInstance());
            System.out.println("Method Invoked: " + methodName);
        } else {
            System.out.println("ClassLoader is null, load a JAR first.");
        }
    }

    // unload JAR
    public void unloadJar() throws Exception {
        if (urlClassLoader != null) {
            urlClassLoader.close();  // close ClassLoader
            urlClassLoader = null;    // let it recycle by jvm
            System.out.println("JAR Unloaded.");
        } else {
            System.out.println("No JAR to unload.");
        }
    }
}

service(demo模块)

  • 创建sevice类
  • mvn install 打包成jar包
package com.et.demo.service;

public class MockService implements Service {
    @Override
    public void printVersion() {
        System.out.println("11.0");
    }
}
package com.et.demo.service;

public interface Service {
    void printVersion();
}

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • https://github.com/Harries/Java-demo(classloader)

3.测试

编写测试类

package com.et;

public class Main {
    public static void main(String[] args) throws Exception {
        JarLoader jarLoader = new JarLoader();

        // load JAR
        jarLoader.loadJar("D:\\IdeaProjects\\Java-demo\\demo\\target\\demo-1.0-SNAPSHOT.jar");

        // invoke the method
        jarLoader.invokeClassMethod("com.et.demo.service.MockService", "printVersion");

        // unload JAR
        jarLoader.unloadJar();
    }
}

启动main方法,查看日志

JAR Loaded: D:\IdeaProjects\Java-demo\demo\target\demo-1.0-SNAPSHOT.jar
11.0
Method Invoked: printVersion
JAR Unloaded.
Disconnected from the target VM, address: '127.0.0.1:53226', transport: 'socket'

Process finished with exit code 0

4.引用

  • https://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html
  • http://www.liuhaihua.cn/archives/711389.html

相关推荐

126官方邮箱登录入囗(126邮箱登录入口手机版官网)

126邮箱是网易的一个免费邮箱登录入口在浏览器输入:mail.126.com浏览器进入126邮箱网站之后,即可自行登录126邮箱账号。如何在手机上登录126邮箱1、打开手机,找到并打开网易邮箱软件。2...

耐用笔记本电脑排行(最耐用笔记本排名)

最耐用的笔记本电脑是联想牌子。联想绝对是最耐用的,质量最好的轻薄本,也是最好用的轻薄本之一。联想笔记本电脑的质量和做工在世界上能称第一。十大公认最耐用笔记本如下1、华硕灵耀x14第12代英特尔酷睿i...

固态硬盘量产工具下载(固态硬盘量产工具下载合集)

固态硬盘量产工具好用的依次是:SLC颗粒最好,MLC颗粒其次,TLC颗粒再次,QLC颗粒现在最次;但是颗粒也分原厂颗粒,黑片,白片;原厂最好,黑片就是淘汰下来的渣渣。slc最好寿命长速度快也最贵...

文件夹怎么显示隐藏的文件夹

查找隐藏文件夹的方式如下:1、点击桌面的“计算机”,双击打开计算机2、在计算机页面中,点开自己存储文件夹的盘,这里以c盘为例。其他盘也可以依据这样的方式进行查找。3、找到左上角的“组织”,在其下拉的菜...

wifi一键连(wifi一键连接下载)
  • wifi一键连(wifi一键连接下载)
  • wifi一键连(wifi一键连接下载)
  • wifi一键连(wifi一键连接下载)
  • wifi一键连(wifi一键连接下载)
电脑硬盘怎么格式化干净(电脑硬盘格式化详细过程)
电脑硬盘怎么格式化干净(电脑硬盘格式化详细过程)

用普通格式化硬盘最干净,采用普通格式化,可以将硬盘中的内容删除掉,同时做上标志,而快速格式化只是对硬盘做了格式化标志,而没有删除内容硬盘格式化步骤:1,打开“我的电脑”,可以看到已经分区好但需要重新格式化的硬盘。2,用右键点击需要格式化的硬...

2026-01-07 06:55 liuian

下载的歌曲怎么转换成mp3格式

一般酷狗音乐下载的都是MP3格式的啊,如果不是的话,也可以通过以下方法来转换。;1、打开浏览器搜索关键词,找到该软件后下载并安装,然后双击打开,再点击“添加文件”。;2、添加后,在右下角选择转换格式为...

所有cpu性能天梯图(所有cpu性能天梯图都一样吗)

1、英特尔(Intel)i59400F酷睿六核盒装CPU处理器;2、英特尔(Intel)i7-9700K酷睿八核盒装CPU处理器;3、英特尔(Intel)i78700酷睿六核盒装...

电脑无故占用大量内存(电脑无故占用大量内存怎么办)

一种可能是后台运行太多,可能是你最近进行了很多任务,导致电脑占用内存变大。也可能是内在任务,类似于你引入了潜在任务,即电脑程序负荷太重,且程序存在不稳定因素,任务自动执行以缓解电脑压力。这个一般没事的...

控制自家wifi的软件防止蹭网
控制自家wifi的软件防止蹭网

软件防蹭网是一种可以帮助用户保护无线网络安全的工具。它可以通过识别和阻止未授权的设备接入无线网络,保护用户的网络免受未经授权的访问和攻击。这些软件通常提供一些安全功能,如MAC地址过滤、WPA2加密、访客网络等,以确保只有授权的设备可以接入...

2026-01-07 04:55 liuian

电脑假死机解决方法(电脑假死现象)

1、看看你笔记本是否是双显卡的配置.在玩游戏和看视频时系统一般会自动启动独立显卡。所以可能就独显运行正常。问题可能和集显有关。2、你先到你笔记本官网,下载型号一致最新版本的主板、双显卡、声卡启动安...

itunes安装错误(itunes安装不成功什么原因)
itunes安装错误(itunes安装不成功什么原因)

苹果电脑itunes的安装不了解决办法原因分析:  出现这种情况,是因为以前安装过itunes,后来在卸载时没有将itunes安装文件夹清除干净。  解决办法:  一般只要将以前安装iitunes的目录全部删除就可以解决了。itunes...

2026-01-07 03:55 liuian

如何查看qq历史好友(如何查找qq历史好友)
  • 如何查看qq历史好友(如何查找qq历史好友)
  • 如何查看qq历史好友(如何查找qq历史好友)
  • 如何查看qq历史好友(如何查找qq历史好友)
  • 如何查看qq历史好友(如何查找qq历史好友)
360重装系统检测不过(360系统重装出现问题)

如果您的360系统重装无法通过检测,可能是由于以下原因:1.系统文件损坏:在使用过程中,一些关键的系统文件可能会丢失或损坏,导致某些功能无法正常运行。这种情况下,您可以尝试修复损坏的系统文件或者重新...

办公软件wps下载(办公软件wps下载免费版)
办公软件wps下载(办公软件wps下载免费版)

1、搜索【WPS】;2、进入官网,选择适合自己的版本,一般选择第一个;3、点击【免费下载】,进行下载;4、下载完成,点击【打开】运行或者双击安装包;5、点击同意许可协议和隐私策略,然后点击立即安装;6、也可以点击右下角的设置图标,更改...

2026-01-07 02:05 liuian