您的位置:首页 > 编程语言 > Java开发

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

2014-10-22 19:52 295 查看
      特殊情况,只有.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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java class