Java如何修改.class文件变量

网友投稿 709 2022-11-23


Java如何修改.class文件变量

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

idea安装jclasslib-bytecode-viewer插件

标准方式安装插件

准备要修改的.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就能看到要修改的内容

修改.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.ClasZQjllAjsFile;

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修改文件变量的资料请关注我们其它相关文章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java读取.properties配置文件的几种方式
下一篇:Spring Security保护用户密码常用方法详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~