使用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
- 使用Javassist对.class文件进行修改
- 使用Javassist对.class文件进行修改
- 使用Javassist对.class文件进行修改(AOP面向切面编程)
- 使用javassist修改class文件
- java反编译软件jd-gui.exe以及使用javassist修改class文件 .
- Myeclipse中的使用javassist修改时class文件时生成的class文件在项目的根目录下。
- 利用javassist修改.class文件,并重新打包
- 使用javassist框架进行动态的更改Class类
- Javassist简单应用 - 不用学习JVM知识也可以修改class文件
- webx—javassist动态创建class文件
- 使用ASM对JAVA class file进行修改的技术 -- 添加类成员
- 使用ASM对JAVA class file进行修改的技术 -- 添加类方法
- java使用eclipse/myeclipse对无源码的class文件进行反编译插件使用
- 使用第三方procyon-decompiler-0.5.30.jar对class文件进行反编译
- gradle学习二 利用javassist api修改class字节码
- 使用jad进行反编译class文件
- 使用PHP对配置文件进行修改
- 使用PHP对配置文件进行修改
- Ken Burns特效的幻灯片
- ----------misc----------
- 拽拙总缀卒组住椎赘籽壮邹住妆罪撰走着
- HDOJ 5067 Harry And Dig Machine 状压DP
- 第9周项目4:乘法口决表
- 使用Javassist对.class文件进行修改
- Java 抽象类
- 2014.10.22
- 走族椎卒总柞卒捉诅琢卓壮浊族浊灼综族
- TTDM-天天点名
- day58,page80
- 面向对象(1)
- (void**) &p的技巧
- 计算机程序设计语言