使用jclasslib简单修改class类
1、自行下载jclasslib,64位电脑需要下载x64的版本,并安装。
2、先用反编译工具jd-gui或能反编译的IDEA查看,推荐使用Intellij IDEA直接查看。
3、用jclasslib打开这个class文件,并根据已知的方法在【method】进行查找
点击【Code】打开所有的信息,并找到自己需要修改常量的地方
4、从jclasslib的安装文件中找到 《jclasslib-library.jar》和 《kotlin-stdlib-xxx.jar》这两个jar包放入到项目中,并建一个类写main方法执行
package com.fh; import java.io.*; import org.gjt.jclasslib.io.ClassFileWriter; import org.gjt.jclasslib.structures.ClassFile; import org.gjt.jclasslib.structures.Constant; import org.gjt.jclasslib.structures.constants.ConstantUtf8Info; public class EditClass { public static void main(String[] args) throws Exception { String filePath = "C:\\Users\\123\\Desktop\\com\\xxxx\\xxxx\\xxxx\\xxxx\\xxxx.class"; FileInputStream fis = new FileInputStream(filePath); DataInput di = new DataInputStream(fis); ClassFile cf = new ClassFile(); cf.read(di); Constant[] infoArr = cf.getConstantPool(); int count = infoArr.length; for (int i = 0; i < count; i++) { if (infoArr[i] != null) { System.out.print(i); System.out.print(" = "); System.out.print(infoArr[i].getVerbose()); System.out.print(" = "); // System.out.println(infoArr[i]); System.out.println(""); if(i == 144){ System.out.println("=========此处修改=================="); System.out.print(i); System.out.print(" = "); System.out.print(infoArr[i].getVerbose()); System.out.print(" = "); // System.out.println(infoArr[i]); System.out.println(""); ConstantUtf8Info uInfo = (ConstantUtf8Info)infoArr[i];//根据对应的类型转换 uInfo.setString("xxx"); infoArr[i] = uInfo; System.out.println("=========此处修改=================="); } } } cf.setConstantPool(infoArr); fis.close(); File f = new File(filePath); ClassFileWriter.writeToFile(f, cf); } }
(因最后发现本次要修改的不在常量中,最后测试走完,换了其他的常量修改,亲测有效)