使用Javassist对.class文件进行修改
2014-10-22 19:52
295 查看
特殊情况,只有.class文件,或者自己把源代码弄丢,就需要修改.class文件文件了。有.class文件的反编译工具,可以将.class文件反编译成java源码,修改以后再编译成.class文件。这样做还是麻烦,有的java类依赖包很多,这样就要把依赖包到找出来进行编译,有时候也许只是想修改一个很小的地方,就没必要这么大费周折了。可以使用javassist库修改.class文件。
修改后的class文件通过反编译后的情况:
可以看出,我们添加的g()在字节码文件中已经被成功编译。
参考文章:http://blog.csdn.net/killme2008/article/details/658731
http://ljhzzyx.blog.163.com/blog/static/383803122010522112537177/
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文件进行修改(AOP面向切面编程)
- 使用Javassist对.class文件进行修改
- java反编译软件jd-gui.exe以及使用javassist修改class文件 .
- 使用javassist修改class文件
- Myeclipse中的使用javassist修改时class文件时生成的class文件在项目的根目录下。
- 使用ASM对JAVA class file进行修改的技术 -- 添加类成员
- 使用fileinput模块进行原地修改文件
- java使用eclipse/myeclipse对无源码的class文件进行反编译插件使用
- Unity3D 使用XML进行简单的配置文件修改
- 使用DrWeb修复hosts文件后无法再进行修改的解决方案
- 使用jad及eclipse插件进行.class文件的反编译
- java中如何使用asm动态的生成或修改一个class文件以及asm的架构思想
- ubuntu下使用vi进行文件修改
- 使用jad及eclipse插件进行.class文件的反编译
- java使用文件或字节数组方式加载图片,并修改图片后进行保存、输出等
- 使用PHP对配置文件进行修改
- 如何使用FTP 进行文件处理 FTP Class
- 使用PHP对配置文件进行修改
- 使用jad及eclipse插件进行.class文件的反编译(转)
- Linux学习23_使用ll命令和chown命令对文件拥有者进行指定或修改