问题描述:在开发中遇到使用第三方jar时想要修改里边某个class文件的情况 解决方法: 通过jclasslib直接修改class文件
安装jclasslib
可以通过下载jclasslib软件来安装(不推荐) 在IEDA插件中搜索安装jclasslib Bytecode Viewer(推荐)
查看修改源码的信息
将jar包内要修改的class文件拖到IDEA中 点击IDEA工具栏中:View => Show Bytecode With Jclasslib jclasslib页面主要有Constant Pool、Interfaces、Fields、Methods、Attributes 在Methods下找到对应的方法,点击code再点击右侧的bytecode
点击#23 依次点击到最终位置,显示的是常量池第109个常量
通过代码修改class文件
package com.logan.functions.controller;
import java.io.*;
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;
public class Test {
public static void main(String[] args) throws Exception {
String filePath = "D:\\CaptchaUtil.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) {
if(i == 109){
System.out.print(i);
System.out.print(" = ");
System.out.print(infos[i].getVerbose());
System.out.print(" = ");
System.out.println(infos[i]);
System.out.println(infos[i].getClass().getSimpleName());
//根据对应的类型转换
ConstantUtf8Info uInfo = (ConstantUtf8Info)infos[i];
uInfo.setString("image/png");
infos[i] = uInfo;
}
}
}
cf.setConstantPool(infos);
fis.close();
File f = new File(filePath);
ClassFileWriter.writeToFile(f, cf);
}
}
执行代码是可能会缺少部分jar,缺少的jar包可以在IDEA安装插件的目录下找得到 一般路径为:C:\Users\用户名\.IntelliJIdea2019.1\config\plugins\jclasslib\lib
|