使用Javassist对.class文件进行修改

来源:互联网 发布:java截取字符串的方法 编辑:程序博客网 时间:2024/05/08 09:05

      特殊情况,只有.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/

0 0
原创粉丝点击