栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java-java.util.jar库加载jar

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java-java.util.jar库加载jar

文章目录
  • 前言
  • 相关概念
    • 什么是JarUrlConnetion
    • jar协议格式
  • 功能
    • 获取JarFile
    • 遍历JarEntry
    • 执行class文件
    • Manifest


前言

最近研究关于classloader,实现对模块的热插拔和类替换等功能。然后意外发现一个用于处理JAR包的官方库。

相关概念 什么是JarUrlConnetion

jarUrlConnection通过Jar协议建立一个访问jar包的连接,可以访问这个jar包内部数据

jar协议格式

jar协议的格式如:jar:{archive-url}!/{entry}。

  • archive-url是文件地址
  • !/是分隔符
  • entry是jar包内部的目录或者文件

示例:

  • 访问远程http服务器
    • 整个jar包。jar:http://www.zsmile.top/test.jar!/
    • jar包内的文件。jar:http://www.zsmile.top/test.jar!/Hello.class
    • jar包内的目录。jar:http://www.zsmile.top/test.jar!/top/smile/
  • 访问本地文件系统
    • 整个jar包。jar:file://E:/test.jar!/
    • jar包内的文件。jar:file://E:/test.jar!/Hello.class
    • jar包内的目录。jar:file://E:/test.jar!/top/smile/
功能 获取JarFile
URL url = new URL("jar:file://E:/test.jar!/");
JarURLConnection conn = (JarURLConnection) url.openConnection();
JarFile jarfile = conn.getJarFile();
遍历JarEntry
Enumeration entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry jarEntry = entries.nextElement();
System.out.println(jarEntry.getName() + " is directory :" + jarEntry.isDirectory());
}
执行class文件
// 获取class数据流
 InputStream inputStream = jarFile.getInputStream(jarEntry);
 int available = inputStream.available();
 byte[] bytes = new byte[available];
inputStream.read(bytes);

// 借助classloader的defineClass将byte转换成class对象
Class aClass = defineClass("top.zsmile.jvm.classloader.Hello", bytes, 0, bytes.length);

// 通过反射调用方法
Method method = aClass.getMethod("main", String[].class);
method.invoke(null, (Object) null);
Manifest
Manifest mainfest = jarfile.getManifest();

// 获取并遍历属性
 System.out.println("manifest Attributes:");
Attributes mainAttributes = manifest.getMainAttributes();
Set> entries = mainAttributes.entrySet();
for (Map.Entry entry : entries) {
    System.out.println(entry.getKey() + "=>" + entry.getValue());
}

// 获取并遍历entry(不知道怎么用)
Map entries1 = manifest.getEntries();
for (Map.Entry entry : entries1.entrySet()) {
    System.out.println(entry.getKey() + "=>" + entry.getValue());
}

// 获取主函数
String mainClassName = manifest.getMainAttributes().getValue(Attributes.Name.MAIN_CLASS);
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/602889.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号