针对有些情况:没有代码环境,部署代码时需要修改 Java 编译后的 class 文件内容(少部分修改)
jclasslib 查看 class 文件内容
Github 工具下载地址:https://github.com/ingokegel/jclasslib/releases
选择对应的版本下载即可
我的在常量池里面找到了要修改的代码,记住 数组的下标
代码修改
使用 UpdateClass ,修改里面 class 文件地址(25 行),数组下标(43 行),要修改的内容(46 行)
附上代码
package com;
import org.gjt.jclasslib.io.ClassFileWriter;
import org.gjt.jclasslib.structures.ClassFile;
import org.gjt.jclasslib.structures.Constant;
import org.gjt.jclasslib.structures.constants.ConstantUtf8Info;
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
/**
* @ClassName UpdateClasses
* @Description: 修改class文件内容
* @Author Lgd
* @Date 2020/9/25
* @Version V1.0
**/
public class UpdateClass {
public static void main(String[] args) throws Exception {
//class文件地址
String filePath = "D:\\LoginSuccessListener.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].getVerbose() != "" ? infos[i].getConstantType() : "");
//要替换的字符串所在的数组下标,通过 jclasslib 去查看
//https://github.com/ingokegel/jclasslib/releases
if(i == 186) {
ConstantUtf8Info uInfo = (ConstantUtf8Info) infos[i];
//替换后的字符串
uInfo.setString("我就是最后的要字符串");
infos[i] = uInfo;
}
}
}
cf.setConstantPool(infos);
fis.close();
File f = new File(filePath);
ClassFileWriter.writeToFile(f, cf);
}
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于