修改class文件
- 下载jclasslib btyecode viewer(64bit)
- 使用软件打开要修改的class,找到二进制行
- idea新建工程,引入jclasslib安装路径下的lib所有jar包
- 使用指定代码,并修改拦截修改二进制行,修改属性或者变量名
下面是我实际工作中的场景:
将其中的distance从200修改为100,值为double类型
打开jclasslib,找到位置行
idea引入工具包
执行代码,其中(i==6)是你要改的行,根据类型不同,set的方法也不同,这里是double,所以用setDouble
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.ConstantDoubleInfo; import org.gjt.jclasslib.structures.constants.ConstantUtf8Info; import org.gjt.jclasslib.structures.constants.ConstantStringInfo; public class demo2 { public static void main(String[] args) throws Exception { String filePath = "C:\\Users\\hezhong.CORP\\Desktop\\1.class"; FileInputStream fis = new FileInputStream(filePath); DataInput di = new DataInputStream(fis); ClassFile cf = new ClassFile(); cf.read(di); Constant[] 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]); System.out.println(infos[i].getClass().getSimpleName()); if(i == 6){ ConstantDoubleInfo uInfo = (ConstantDoubleInfo)infos[i]; uInfo.setDouble(200.0); infos[i]=uInfo; } } } cf.setConstantPool(infos); fis.close(); File f = new File(filePath); ClassFileWriter.writeToFile(f, cf); } }