jclasslib修改class文件

今天看到别人写的用工具jclasslib直接修改别人jar包里面的class文件,我自己也学着写了一下,发现果然很强大,但是也遇到一些坑

public class JVMTest {
	public static void main(String[] args) {
		long maxMemory = Runtime.getRuntime().maxMemory();  //返回Java虚拟机试图使用的最大内存量。
		Long totalMemory = Runtime.getRuntime().totalMemory();  //返回Java虚拟机中的内存总量。  
		System.out.println("MAX_MEMORY ="+maxMemory +"(字节)、"+(maxMemory/(double)1024/1024) + "MB");  
        System.out.println("TOTAL_ MEMORY = "+totalMemory +"(字节)"+(totalMemory/(double)1024/1024) + "MB");
	}
}

这是自己写的java类,编译之后生成JVMTest.class

用jclasslib工具打开这个class文件

jclasslib修改class文件_第1张图片

点击#21,看到这个字节处于Constant Pool常量池的第54个常量

jclasslib修改class文件_第2张图片

现在就可以在eclipse里面新建一个类来处理这个class了

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.ClassFile;
import org.gjt.jclasslib.structures.Constant;
import org.gjt.jclasslib.structures.constants.ConstantUtf8Info;

public class testChangClass {

	public static void main(String[] args) throws Exception {
		String filePath = "E:\\java\\jclasslib\\testChangeClass\\JVMTest.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() != "");
				System.out.println(infos[i].getVerbose() != "" ? infos[i].getConstantType() : "");
				if(i == 54) {
					ConstantUtf8Info uInfo = (ConstantUtf8Info) infos[i];
					uInfo.setString("芝麻不开门!");
					infos[i] = uInfo;
				}
			}
		}
		cf.setConstantPool(infos);
		fis.close();
		File f = new File(filePath);
		ClassFileWriter.writeToFile(f, cf);
	}
}

这里运行的时候就遇到报错,在网上找了很久最后引入两个jar包才解决掉

jclasslib修改class文件_第3张图片

运行之后jclasslib修改class文件_第4张图片

这个时候我们在shell窗口运行class文件就发现输出改变了

jclasslib修改class文件_第5张图片

jclasslib还是很好用的

你可能感兴趣的:(java)