使用jclasslib工具和jclasslib.jar修改class文件中String常量(详细图文教程)
安装使用工具 jclasslib
32位版本jdk1.8无法使用 推荐安装64位如下图
安装完成后打开
初始class文件用idea查看
点开Constant Pool 常量池选择String常量
在常量池中找到需要修改的String参数
下载官方jclasslib.jar包 (工具和jar包链接后面提供)
创建一个类,引入jclasslib包,main方法
准备完成后启动main方法,再次查看class文件
main方法代码,可自行修改
//导入的包
import java.io.*;
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 static void main(String[] args) throws Exception {
String filePath = "C:\\Users\\Administrator\\Desktop\\test\\ClassTest.class";
FileInputStream fis = new FileInputStream(filePath);
DataInput di = new DataInputStream(fis);
ClassFile cf = new ClassFile();
cf.read(di);
CPInfo[] infos = cf.getConstantPool();
int count = infos.length;
for (int i = 0; i < count; i++) {
if (infos[i] != null) {
System.out.print(i);
System.out.print(" = ");
System.out.print(infos[i].getVerbose());
System.out.print(" = ");
System.out.println(infos[i].getTagVerbose());
if (i == 32) {//用jclasslib找到的位置
//刚刚那里是CONSTANT_Utf-8_info所以这里要用这个
ConstantUtf8Info uInfo = (ConstantUtf8Info) infos[i];
uInfo.setBytes("修改后的String".getBytes());
infos[i] = uInfo;
}
}
}
cf.setConstantPool(infos);
fis.close();
File f = new File(filePath);
ClassFileWriter.writeToFile(f, cf);
}