直接修改Java编译后的class文件


针对有些情况:没有代码环境,部署代码时需要修改Java编译后的class文件内容(少部分修改)

代码可在github下载

jclasslib查看class文件内容

Github工具下载地址:https://github.com/ingokegel/jclasslib/releases
选择对应的版本下载即可

image.png

我的在常量池里面找到了要修改的代码,记住 数组的下标
image.png

image.png

代码修改

使用 UpdateClass ,修改里面class文件地址(25行),数组下标(43行),要修改的内容(46行)

附上代码

package com;

import org.gjt.jclasslib.io.ClassFileWriter;
import org.gjt.jclasslib.structures.ClassFile;
import org.gjt.jclasslib.structures.Constant;
import org.gjt.jclasslib.structures.constants.ConstantUtf8Info;

import java.io.DataInput;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;

/**
 * @ClassName UpdateClasses
 * @Description: 修改class文件内容
 * @Author Lgd
 * @Date 2020/9/25
 * @Version V1.0
 **/
public class UpdateClass {

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

        //class文件地址
        String filePath = "D:\\LoginSuccessListener.class";
        FileInputStream fis = new FileInputStream(filePath);

        DataInput di = new DataInputStream(fis);
        ClassFile cf = new ClassFile();
        cf.read(di);
        Constant[] infos = cf.getConstantPool();

        int count = infos.length;
        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].getVerbose() != "" ? infos[i].getConstantType() : "");
                //要替换的字符串所在的数组下标,通过 jclasslib 去查看
                //https://github.com/ingokegel/jclasslib/releases
                if(i == 186) {
                    ConstantUtf8Info uInfo = (ConstantUtf8Info) infos[i];
                    //替换后的字符串
                    uInfo.setString("我就是最后的要字符串");
                    infos[i] = uInfo;
                }
            }
        }
        cf.setConstantPool(infos);
        fis.close();
        File f = new File(filePath);
        ClassFileWriter.writeToFile(f, cf);
    }
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM