1. 程式人生 > >java修改class檔案指定內容

java修改class檔案指定內容

在java 中可以直接修改class檔案,而不用反編譯,方法如下:

import java.io.DataInput;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import org.gjt.jclasslib.io.ClassFileWriter;
import org.gjt.jclasslib.structures.CPInfo;
import org.gjt.jclasslib.structures.ClassFile;
import org.gjt.jclasslib.structures.InvalidByteCodeException;
import org.gjt.jclasslib.structures.constants.ConstantUtf8Info;

public class Test {
	/**
	 * 修改class
	 * 
	 * @param filePath
	 * @param oldString
	 * @param newString
	 */
	public static void modifyClass(String filePath, String oldString, String newString) {
		try {
			// 讀取class檔案
			FileInputStream fis = new FileInputStream(filePath);
 
			DataInput di = new DataInputStream(fis);
			ClassFile cf = new ClassFile();
			cf.read(di);
			CPInfo[] infos = cf.getConstantPool(); // 將class檔案內容讀成陣列
 
			for (int i = 1; i < infos.length; i++) {
				if (infos[i].getTagVerbose().equals("CONSTANT_Utf8_info")) { // 取class中程式碼資訊
					ConstantUtf8Info info = (ConstantUtf8Info) infos[i];
					if (info.getVerbose().equals(oldString)) { // 得到要替換的string的位置
						info.setBytes(newString.getBytes()); // 替換為新的string
						infos[i] = info;
					}
				}
			}
 
			// 儲存修改後的class
			cf.setConstantPool(infos);
			fis.close();
			File f = new File(filePath);
			ClassFileWriter.writeToFile(f, cf);
		} catch (InvalidByteCodeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
 
	}
}

需要使用到的jar,參見:https://download.csdn.net/download/yanjingtp/10331860