java修改class檔案指定內容
阿新 • • 發佈:2019-01-07
在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