今天看到别人写的用工具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文件
点击#21,看到这个字节处于Constant Pool常量池的第54个常量
现在就可以在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包才解决掉
运行之后
这个时候我们在shell窗口运行class文件就发现输出改变了
jclasslib还是很好用的