直接修改字节码中的常量池

来源:互联网 发布:wind资讯经济数据终端 编辑:程序博客网 时间:2024/06/05 19:02

这个类用于修改java中class字节码中的常量池。需要jclasslib.jar

可以使用jd-gui和字节码查看器确定要修改的内容

http://www.ej-technologies.com/download/jclasslib/files.html

参考

http://wenku.baidu.com/view/2aeb2abec77da26925c5b02b.html

import java.io.DataInput;import java.io.DataInputStream;import java.io.File;import java.io.FileInputStream;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="d:/myFolder/com/example/test.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;            for(int i =0;i<count;i++){                if(infos[i]!=null){                    System.out.println(i+" = "+infos[i].getVerbose()+" = "+infos[i].getTagVerbose());                    if(i == 1){                        ConstantUtf8Info uInfo=(ConstantUtf8Info)infos[i];                        uInfo.setString(" oh my lady gaga ");                    }                }            }            cf.setConstantPool(infos);            fis.close();            File f=new File(filePath+"c");            ClassFileWriter.writeToFile(f, cf);        }        }