分享

使用javassist 实现直接修改class文件中的方法

 看见就非常 2014-12-01
使用javassist 可以实现直接修改class文件中的方法,javassist是jboss的一个子项目,其主要的优点,在于简单,而且快速。直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类。
下面是例子:
1.要修改的class文件的代码,当然正常情况下你是看不到的
package com.ms.xbox.halo.reach;
public class For_test {
 public final boolean output(){
  return false;
 }
public static void main(String[] args) {
  // TODO Auto-generated method stub
  String strAaa="输出结果";
  System.out.println(strAaa);
}
}
2.随便建一个java工程,引入javassist的jar包,编译环境我用的1.4版本jdk,修改代码如下

import javassist.*;
public class test {
  public static void main(String args[]) throws Exception{
    ClassPool cp = ClassPool.getDefault();

//获得类文件名
    CtClass cc = cp.get("com.ms.xbox.halo.reach.For_test");

//获得要修改的方法名
    CtMethod m = cc.getDeclaredMethod("output");
      //这里是将返回结果改成true
      m.insertBefore("return  true;");
      cc.writeFile();
   }
}
3.执行 java test,用反编译工具(这里用的是jd-gui),再去看看文件夹 com\ms\xbox\halo\reach下的类For_test,方法output已经被修改了

package com.ms.xbox.halo.reach;
public class For_test {
 public final boolean output(){
    return true;return false;
 }
public static void main(String[] args) {
  // TODO Auto-generated method stub
  String strAaa="输出结果";
  System.out.println(strAaa);
}
}
 
当然javassist 还有很多的功能,可以修改类中方法的属性,新增加方法,修改已有方法的程序体,上面只是一个很简单的例子.
 
感谢能看完全文,javassist jar包的下载地址:
http://cdnetworks-kr-1.dl./project/jboss/Javassist/3.11.0.GA/javassist-3.11.GA.zip
  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多