通过JClassLib修改Class文件

来源:互联网 发布:gcc可用windows界面库 编辑:程序博客网 时间:2024/04/28 18:11

今天在网上看到通过jclasslib修改class文件的文章,记录一下。

原文地址:http://blog.csdn.net/hexin373/article/details/6669813


1)建一个测试的Class文件

public class JClassLibTestPrintString {public String getPrintMessage() {return "这是一个修改之前的数据";}public static void main(String[] args) {System.out.println(new JClassLibTestPrintString().getPrintMessage());}}显示输出结果如下


2)通过jclasslib查找Class定义的变量池位置

打开编译好的Class文件,选择Methods-->[1]getPrintMessage-->[0]Code


点红色圈的位置#2,会显示如下图位置

cp_inf #20 就是这个变量所在的位置,也可以继续点进去看看

3)通过程序改掉之前定义的变量内容

import java.io.DataInput;import java.io.DataInputStream;import java.io.File;import java.io.FileInputStream;import org.gjt.jclasslib.io.ClassFileWriter;import org.gjt.jclasslib.structures.CPInfo;import org.gjt.jclasslib.structures.ClassFile;import org.gjt.jclasslib.structures.constants.ConstantUtf8Info;public class JClassLibModifyClassFile {public static void main(String[] args) throws Exception {String filePath = "E:\\applib\\example\\jclasslib\\JClassLibTestPrintString.class";FileInputStream fis = new FileInputStream(filePath);DataInput di = new DataInputStream(fis);ClassFile classFile = new ClassFile();classFile.read(di);CPInfo[] infos = classFile.getConstantPool();int count = infos.length;for (int i = 0; i < count; i++) {if (infos[i] != null && i == 20) {//找到第20个变量池ConstantUtf8Info uInfo = (ConstantUtf8Info)infos[i];uInfo.setBytes("这是通过jclasslib修改后的结果".getBytes());infos[i] = uInfo;}}classFile.setConstantPool(infos);fis.close();ClassFileWriter.writeToFile(new File(filePath), classFile);System.out.println("修改成功");}}
执行上面的程序,如下

和之前的结果比,已经修改了JClassLibTestPrintString的输出结果。



0 0