1. 程式人生 > 實用技巧 >java修改class檔案

java修改class檔案

最近因為工作需要修改class檔案中一個變數的值,特此記錄

1、首先使用bytecode viewer開啟class檔案(下載地址:連結:https://pan.baidu.com/s/1fo6SWTfoNZ5usEQU_R4JmA 提取碼:zecz)

2、找到要修改的變數所在的地址

3、建立一個java工程、並且將jclasslib.jar匯入、執行以下程式碼即可

 1 package cc.cc.c;
 2  
 3 import java.io.*;
 4 import org.gjt.jclasslib.io.ClassFileWriter;
 5 import org.gjt.jclasslib.structures.CPInfo;
6 import org.gjt.jclasslib.structures.ClassFile; 7 import org.gjt.jclasslib.structures.constants.ConstantUtf8Info; 8 9 public class Main { 10 public static void main(String[] args) throws Exception { 11 12 String filePath = "C:\\Main.class"; 13 FileInputStream fis = new FileInputStream(filePath);
14 DataInput di = new DataInputStream(fis); 15 ClassFile cf = new ClassFile(); 16 cf.read(di); 17 CPInfo[] infos = cf.getConstantPool(); 18 19 int count = infos.length; 20 for (int i = 0; i < count; i++) { 21 if (infos[i] != null) { 22 System.out.print(i);
23 System.out.print(" = "); 24 System.out.print(infos[i].getVerbose()); 25 System.out.print(" = "); 26 System.out.println(infos[i].getTagVerbose()); 27 if (i == 21) {//剛剛找到的是21位置 28 ConstantUtf8Info uInfo = (ConstantUtf8Info) infos[i]; //剛剛那裡是CONSTANT_Utf-8_info所以這裡要用這個 29 uInfo.setBytes("baidu".getBytes()); 30 infos[i] = uInfo; 31 } 32 } 33 } 34 //這種方式也可以,一樣的 35 /* if(infos[count] != null) { 36 ConstantUtf8Info uInfo = (ConstantUtf8Info) infos[i]; //剛剛那裡是CONSTANT_Utf-8_info所以這裡要用這個 37 uInfo.setBytes("baidu".getBytes()); 38 infos[count] = uInfo; 39 }*/ 40 41 cf.setConstantPool(infos); 42 fis.close(); 43 File f = new File(filePath); 44 ClassFileWriter.writeToFile(f, cf); 45 } 46 }

本修改方式參考了https://blog.csdn.net/betterandroid/article/details/14520667