问题描述:在开发中遇到使用第三方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