Java如何修改.class文件變量
最近遇到了一個問題,一份很老的代碼要修改里面的變量,源碼早就和開發(fā)者一起不知去向,其中引用了一些jar包導(dǎo)致無法直接編譯,只能直接修改.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功能找到要修改的內(nèi)容,我們發(fā)現(xiàn)有一個String類型常量,指向23,點擊23就能看到要修改的內(nèi)容


修改.class文件中的變量
23是要修改的內(nèi)容
/**
* @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);
}
}
執(zhí)行結(jié)果
可以看到已經(jīng)修改完成
public class HelloWorld {
public HelloWorld() {
}
public static void main(String[] args) {
String word = "Hello World HELLO WORLD";
System.out.println(word);
}
}
以上就是Java如何修改.class文件變量的詳細內(nèi)容,更多關(guān)于Java修改文件變量的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MybatisPlus的MetaObjectHandler與@TableLogic使用
這篇文章主要介紹了MybatisPlus的MetaObjectHandler與@TableLogic使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04
springboot如何接收復(fù)雜參數(shù)(同時接收JSON與文件)
文章介紹了在Spring Boot中同時處理JSON和文件上傳時使用`@RequestPart`注解的方法,`@RequestPart`可以接收多種格式的參數(shù),包括JSON和文件,并且可以作為`multipart/form-data`格式中的key2025-02-02
Spring中@ControllerAdvice注解的用法解析
這篇文章主要介紹了Spring中@ControllerAdvice注解的用法解析,顧名思義,@ControllerAdvice就是@Controller 的增強版,@ControllerAdvice主要用來處理全局數(shù)據(jù),一般搭配@ExceptionHandler、@ModelAttribute以及@InitBinder使用,需要的朋友可以參考下2023-10-10
JAVA對list集合進行排序Collections.sort()
這篇文章主要介紹了JAVA對list集合進行排序Collections.sort(),需要的朋友可以參考下2017-01-01
解決Spring運行時報錯:Consider defining a bean o
該文章主要講述了在使用Spring框架時,如果遇到某個bean未找到的錯誤,應(yīng)該在配置文件中定義該bean,解決方法是在對應(yīng)的類上添加@Component注解2025-01-01
springboot使用Mybatis-plus分頁插件的案例詳解
這篇文章主要介紹了springboot使用Mybatis-plus分頁插件的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05

