• java修改class文件


    最近因为工作需要修改class文件中一个变量的值,特此记录

    1、首先使用bytecode viewer打开class文件(下载地址:链接:https://pan.baidu.com/s/1fo6SWTfoNZ5usEQU_R4JmA    提取码:zecz)

     2、找到要修改的变量所在的地址

     3、创建一个java工程、并且将jclasslib.jar导入、执行以下代码即可

     1 package cc.cc.c;
     2  
     3 import java.io.*;
     4 import org.gjt.jclasslib.io.ClassFileWriter;
     5 import org.gjt.jclasslib.structures.CPInfo;
     6 import org.gjt.jclasslib.structures.ClassFile;
     7 import org.gjt.jclasslib.structures.constants.ConstantUtf8Info;
     8  
     9 public class Main {
    10     public static void main(String[] args) throws Exception {
    11  
    12         String filePath = "C:\Main.class";
    13         FileInputStream fis = new FileInputStream(filePath);
    14         DataInput di = new DataInputStream(fis);
    15         ClassFile cf = new ClassFile();
    16         cf.read(di);
    17         CPInfo[] infos = cf.getConstantPool();
    18  
    19         int count = infos.length;
    20         for (int i = 0; i < count; i++) {
    21             if (infos[i] != null) {
    22                 System.out.print(i);
    23                 System.out.print(" = ");
    24                 System.out.print(infos[i].getVerbose());
    25                 System.out.print(" = ");
    26                 System.out.println(infos[i].getTagVerbose());
    27                 if (i == 21) {//刚刚找到的是21位置
    28                     ConstantUtf8Info uInfo = (ConstantUtf8Info) infos[i]; //刚刚那里是CONSTANT_Utf-8_info所以这里要用这个
    29                     uInfo.setBytes("baidu".getBytes());
    30                     infos[i] = uInfo;
    31                 }
    32             }
    33         }
    34         //这种方式也可以,一样的
    35 /*        if(infos[count] != null) {
    36             ConstantUtf8Info uInfo = (ConstantUtf8Info) infos[i]; //刚刚那里是CONSTANT_Utf-8_info所以这里要用这个
    37             uInfo.setBytes("baidu".getBytes());
    38             infos[count] = uInfo;
    39         }*/
    40         
    41         cf.setConstantPool(infos);
    42         fis.close();
    43         File f = new File(filePath);
    44         ClassFileWriter.writeToFile(f, cf);
    45     }
    46 }

     本修改方式参考了https://blog.csdn.net/betterandroid/article/details/14520667

  • 相关阅读:
    排序算法——堆排序 转载
    排序之冒泡排序
    排序之直接插入排序(Straight Insertion Sort)
    浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析
    插入法==冒泡排序
    排序的算法
    排序]
    Linux下zoopkeeper的安装和启动
    Linux下zoopkeeper的安装和启动
    Linux下切换使用两个版本的JDK
  • 原文地址:https://www.cnblogs.com/markleilei/p/13666306.html
Copyright © 2020-2023  润新知