利用ClasserLoader来实现jar包加载并调用里面的方法
liuian 2025-01-07 14:15 64 浏览
1.ClasserLoader介绍?
classloader顾名思义,即是类加载。虚拟机把描述类的数据从class字节码文件加载到内存,并对数据进行检验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。了解java的类加载机制,可以快速解决运行时的各种加载问题并快速定位其背后的本质原因,也是解决疑难杂症的利器。因此学好类加载原理也至关重要。
内置类加载器
JVM 中内置了三个重要的ClassLoader:
- BootstrapClassLoader(启动类加载器):最顶层的加载类,由 C++实现,通常表示为 null,并且没有父级,主要用来加载 JDK 内部的核心类库( %JAVA_HOME%/lib目录下的 rt.jar、resources.jar、charsets.jar等 jar 包和类)以及被 -Xbootclasspath参数指定的路径下的所有类。
- ExtensionClassLoader(扩展类加载器):主要负责加载 %JRE_HOME%/lib/ext 目录下的 jar 包和类以及被 java.ext.dirs 系统变量所指定的路径下的所有类。
- 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 04.引用
- 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、找到左上角的“组织”,在其下拉的菜...
-
- 电脑硬盘怎么格式化干净(电脑硬盘格式化详细过程)
-
用普通格式化硬盘最干净,采用普通格式化,可以将硬盘中的内容删除掉,同时做上标志,而快速格式化只是对硬盘做了格式化标志,而没有删除内容硬盘格式化步骤: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的软件防止蹭网
-
软件防蹭网是一种可以帮助用户保护无线网络安全的工具。它可以通过识别和阻止未授权的设备接入无线网络,保护用户的网络免受未经授权的访问和攻击。这些软件通常提供一些安全功能,如MAC地址过滤、WPA2加密、访客网络等,以确保只有授权的设备可以接入...
-
2026-01-07 04:55 liuian
- 电脑假死机解决方法(电脑假死现象)
-
1、看看你笔记本是否是双显卡的配置.在玩游戏和看视频时系统一般会自动启动独立显卡。所以可能就独显运行正常。问题可能和集显有关。2、你先到你笔记本官网,下载型号一致最新版本的主板、双显卡、声卡启动安...
-
- itunes安装错误(itunes安装不成功什么原因)
-
苹果电脑itunes的安装不了解决办法原因分析: 出现这种情况,是因为以前安装过itunes,后来在卸载时没有将itunes安装文件夹清除干净。 解决办法: 一般只要将以前安装iitunes的目录全部删除就可以解决了。itunes...
-
2026-01-07 03:55 liuian
- 360重装系统检测不过(360系统重装出现问题)
-
如果您的360系统重装无法通过检测,可能是由于以下原因:1.系统文件损坏:在使用过程中,一些关键的系统文件可能会丢失或损坏,导致某些功能无法正常运行。这种情况下,您可以尝试修复损坏的系统文件或者重新...
-
- 办公软件wps下载(办公软件wps下载免费版)
-
1、搜索【WPS】;2、进入官网,选择适合自己的版本,一般选择第一个;3、点击【免费下载】,进行下载;4、下载完成,点击【打开】运行或者双击安装包;5、点击同意许可协议和隐私策略,然后点击立即安装;6、也可以点击右下角的设置图标,更改...
-
2026-01-07 02:05 liuian
- 一周热门
-
-
飞牛OS入门安装遇到问题,如何解决?
-
如何在 iPhone 和 Android 上恢复已删除的抖音消息
-
Boost高性能并发无锁队列指南:boost::lockfree::queue
-
大模型手册: 保姆级用CherryStudio知识库
-
用什么工具在Win中查看8G大的log文件?
-
如何在 Windows 10 或 11 上通过命令行安装 Node.js 和 NPM
-
威联通NAS安装阿里云盘WebDAV服务并添加到Infuse
-
Trae IDE 如何与 GitHub 无缝对接?
-
idea插件之maven search(工欲善其事,必先利其器)
-
如何修改图片拍摄日期?快速修改图片拍摄日期的6种方法
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
