Java如何修改.class文件变量
作者:zero 发布时间:2022-05-18 17:07:50
标签: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.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);
}
}
来源:https://segmentfault.com/a/1190000023909465?utm_source=tuicool&utm_medium=referral
0
投稿
猜你喜欢
- Kotlin开发Android应用实例详解我们简单的知道了Kotlin这门新语言的优势,也接触了一些常见的语法及其简单的使用,相信你会对它有
- JFrame默认的窗体比较土,可以通过一定的美化,让窗体表现的比较漂亮,具体要根据设计的设计图进行美化;JFrame美化的大致思路:先将JF
- 1、使用第三方类库 HtmlAgilityPack官方网址:https://html-agility-pack.net/?z=codeple
- Jackson 日期格式化技巧使用 Spring Boot 时,需要使用 Jackson 处理一些 Java Time API 类型的 JS
- 一、@RestController 注解在 Spring Boot 中的 Controller 中使用 @RestController 注解
- 本文实例讲述了C#4.0新特性的协变与逆变,有助于大家进一步掌握C#4.0程序设计。具体分析如下:一、C#3.0以前的协变与逆变如果你是第一
- 本文实例为大家分享了C#实现窗体抖动的具体代码,供大家参考,具体内容如下原理:围绕中心点运动一圈方法一:通过线程实现需求:需要using S
- public static boolean isMobileNumber(String mobiles) {return Pattern.c
- 前言目前主流的锁有两种,一种是synchronized,另一种就是ReentrantLock,JDK优化到现在目前为止synchronize
- 前言最近在刷java面试题偶然看到这类问题(try/finally中含有return时的执行顺序),觉得挺有意思于是小小的研究了一下,希望经
- 在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java
- Java 执行CMD命令或执行BAT批处理背景日常开发中总能遇到一些奇怪的需求,例如使用java执行cmd命令或者bat批处理文件,今天就简
- 一、IO流的分类字符流ReaderInputStreamReader(节点流)BufferedReader(处理流)WriterOutput
- 前言taptap-developer是一个spring boot框架驱动的纯Grpc服务,所以,只用了四步,移除了web和spring cl
- 弃用内容先来纠正一个误区。主要之前在版本更新介绍的时候,存在一些表述上的问题。导致部分读者认为这次的更新是Datasource本身初始化的调
- 很多主流框架都使用了反射技术.像ssh框架都采用两种技术 xml做配置文件+反射技术.与反射有关的类包.java.lang.reflect.
- 引出泛型我们通过如下的示例,引出为什么泛型的概念。public class Test {public static void main(St
- 前 言🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端☕专栏简介:深入、全面、系统的介绍消息中间件🌰 文章简介
- 这两种方式也是大家在日常编码工作当中用的比较多的判断方式、之前在使用的时候也没太关注两者在比较不同类型的时候存在哪些区别今天就和大家一起深入
- MultipartResolver和ServletFileUpload冲突如果同时使用了MultipartResolver 和Servlet