Jar包class文件查增

这篇博客介绍了如何在已打包的Java Jar文件中进行查询和新增Class文件的操作。首先,通过`getJarEntryList`方法列出Jar包内的所有条目,然后展示查询过程。接着,展示了如何新增Class文件到Jar包中,使用`addNewClassToJar`方法将新生成的Class文件写入新的Jar包,并保留原有文件。整个过程涉及到文件流的读写及Java的Jar处理技巧。
摘要由CSDN通过智能技术生成

Jar包class文件查增

针对已经打包好的jar,对里面的文件进行增删改查(现只修改class,其他文件同理)

准备一个要查看的Jar包,如“XXXX.jar”

一、查询

//原jar包地址
String jarPath =  "XXXX.jar";
List<JarEntry> jarEntryList = JarTool.getJarEntryList(jarPath);
System.out.println("Jar包里的数据 : ");
//循环jarEntryList 获取

//获取方法
public static List<JarEntry> getJarEntryList(String jarPath) throws IOException {
        File file = new File(jarPath);
        JarFile jarFile = new JarFile(file);
        //获取 entries 集合lists
        List<JarEntry> lists = new LinkedList<>();
        Enumeration<JarEntry> entries = jarFile.entries();
        while (entries.hasMoreElements()) {
            JarEntry jarEntry = entries.nextElement();
            lists.add(jarEntry);
        }
        // 将修改后的内容写入jar包中的指定文件
        jarFile.close();
        return lists;
    }

二、新增

//原jar包地址
String jarPath =  "XXXX.jar";
//原jar包数据
List<JarEntry> jarEntryList = JarTool.getJarEntryList(jarPath);

//新jar包地址
String jarNewPath =="test/XXXX.jar";
//获取新jar包的输出流
File file = new File(jarPath);
JarFile jarFile = new JarFile(file);
FileOutputStream fos = new FileOutputStream(jarNewPath, true);
JarOutputStream jos = new JarOutputStream(fos);

//准备新加入jar包的class文件
Map<String, byte[]> addClassMap = new HashMap<>();
通过javassist生成新的class文件
String classPath = "com.test.AddTest";
ClassPool pool = new ClassPool(true);
CtClass ctClass = pool.makeClass(classPath );
//省掉添加 属性 和 方法 的过程....
//把生成好的class放入addClassMap (注意: “.”变成“/”,再加上“.class”)
addClassMap .put(classPath .replaceAll("\\.", "/") + ".class", ctClass.toBytecode());

//输出生成新的jar包
JarTool.addNewClassToJar(jos, jarEntryList, jarFile, addClassMap );
jos.close();
fos.close();

//输出方法
public static void addNewClassToJar(JarOutputStream jos, List<JarEntry> lists, JarFile jarFile, Map<String, byte[]> newClass) {
        try {
       		 //先写原jar数据
            for (JarEntry je : lists) {
                //表示将该JarEntry写入jar文件中 也就是创建该文件夹和文件
                jos.putNextEntry(new JarEntry(je));
                jos.write(streamToByte(jarFile.getInputStream(je)));
            }
            //再写新添加的class数据
            for (Map.Entry<String, byte[]> entry : newClass.entrySet()) {
                jos.putNextEntry(new JarEntry(entry.getKey()));
                jos.write(entry.getValue());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

private static byte[] streamToByte(InputStream inputStream) {
        ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
        try {
            byte[] buffer = new byte[1024];
            int len;
            while ((len = inputStream.read(buffer)) != -1) {
                outSteam.write(buffer, 0, len);
            }
            outSteam.close();
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return outSteam.toByteArray();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值