今天在网上看到通过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的输出结果。