在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