本文主要是介绍使用Javassist对.class文件进行修改,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
特殊情况,只有.class文件,或者自己把源代码弄丢,就需要修改.class文件文件了。有.class文件的反编译工具,可以将.class文件反编译成java源码,修改以后再编译成.class文件。这样做还是麻烦,有的java类依赖包很多,这样就要把依赖包到找出来进行编译,有时候也许只是想修改一个很小的地方,就没必要这么大费周折了。可以使用javassist库修改.class文件。
package com.hcj.javaassist;import java.lang.reflect.Method;import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.NotFoundException;public class Test2 {public int f(int i) {i++;return i;}public static void main(String[] args) throws Exception {ClassPool pool = ClassPool.getDefault();//设置目标类的路径(即目标类的class路径,我这里的test2.class是在工程下WebRoot/WEB-INF/classes/com/hcj/javaassist)pool.insertClassPath("WebRoot/WEB-INF/classes/com/hcj/javaassist");//获得要修改的类(注意,一定要类的全称)CtClass cc = pool.get("com.hcj.javaassist.Test2");Test2 test = new Test2();Class c = test.getClass();
// Method[] method = c.getDeclaredMethods();try {cc.getDeclaredMethod("g");System.out.println("g() is already defined in sample.Test.");} catch (Exception e) {CtMethod fMethod = cc.getDeclaredMethod("f");CtMethod gMethod = CtNewMethod.copy(fMethod, "g", cc, null);cc.addMethod(gMethod);cc.writeFile(); // 更新class文件System.out.println("g() was added.");}}
}
修改后的class文件通过反编译后的情况:
package com.hcj.javaassist;import java.io.PrintStream;
import java.lang.reflect.Method;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;public class Test2
{public int f(int i){i++;return i;}public static void main(String[] args) throws Exception {ClassPool pool = ClassPool.getDefault();CtClass cc = pool.get("com.hcj.javaassist.Test2");Test2 test = new Test2();Class c = test.getClass();Method[] method = c.getDeclaredMethods();for (int i = 0; i < method.length; i++)System.out.println(method[i]);try{cc.getDeclaredMethod("g");System.out.println("g() is already defined in sample.Test.");}catch (Exception e){CtMethod fMethod = cc.getDeclaredMethod("f");CtMethod gMethod = CtNewMethod.copy(fMethod, "g", cc, null);cc.addMethod(gMethod);cc.writeFile("E:/Workspaces/MyEclipse 10/test/WebRoot/WEB-INF/classes/com/hcj/javaassist");System.out.println("g() was added.");}}public int g(int i){i++;return i;}
}
可以看出,我们添加的g()在字节码文件中已经被成功编译。
参考文章:http://blog.csdn.net/killme2008/article/details/658731
http://ljhzzyx.blog.163.com/blog/static/383803122010522112537177/
这篇关于使用Javassist对.class文件进行修改的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!