java class修改_Java如何修改.class文件变量

最近遇到了一个问题,一份很老的代码要修改里面的变量,源码早就和开发者一起不知去向,其中引用了一些jar包导致无法直接编译,只能直接修改.class文件

idea安装jclasslib-bytecode-viewer插件

标准方式安装插件

2ce59ce9da6e42cc5020e8d498fd4e22.png

准备要修改的.class文件

这里我们写一个简单的java方法

/**

* @Description:

* @author: wei.wang

* @since: 2020/9/5 11:18

* @history: 1.2020/9/5 created by wei.wang

*/

public class HelloWorld {

public static void main(String[] args) {

String word = "Hello World";

System.out.println(word);

}

}

查找要修改的变量

打开要修改的.class文件,点击view->Show Bytecode With Jclasslib ,在Constants Pool中使用Text filter功能找到要修改的内容,我们发现有一个String类型常量,指向23,点击23就能看到要修改的内容

27a658703bbe9b12f95fa32ae0219ce7.png

9e26d1f87d383ca48a1473afca5ddc29.png

修改.class文件中的变量

23是要修改的内容

/**

* @Description:

* @author: wei.wang

* @since: 2020/9/4 19:42

* @history: 1.2020/9/4 created by wei.wang

*/

import java.io.*;

import org.gjt.jclasslib.io.ClassFileWriter;

import org.gjt.jclasslib.structures.CPInfo;

import org.gjt.jclasslib.structures.ClassFile;

import org.gjt.jclasslib.structures.constants.ConstantUtf8Info;

public class Test {

public static void main(String[] args) throws Exception {

String filePath = "F:\\GitCode\\zero\\test111\\target\\classes\\HelloWorld.class";

FileInputStream fis = new FileInputStream(filePath);

DataInput di = new DataInputStream(fis);

ClassFile cf = new ClassFile();

cf.read(di);

CPInfo[] infos = cf.getConstantPool();

int count = infos.length;

System.out.println(count);

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].getTagVerbose());

//对23进行修改

if(i == 23){

ConstantUtf8Info uInfo = (ConstantUtf8Info)infos[i];

uInfo.setBytes("Hello World HELLO WORLD".getBytes());

infos[i]=uInfo;

}

}

}

cf.setConstantPool(infos);

fis.close();

File f = new File(filePath);

ClassFileWriter.writeToFile(f, cf);

}

}

执行结果

可以看到已经修改完成

public class HelloWorld {

public HelloWorld() {

}

public static void main(String[] args) {

String word = "Hello World HELLO WORLD";

System.out.println(word);

}

}

以上就是Java如何修改.class文件变量的详细内容,更多关于Java修改文件变量的资料请关注脚本之家其它相关文章!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值