反编译jar实现的三种方式

  import javassist.ClassPool;

  import javassist.CtClass;

  import javassist.CtMethod;

  import java.util.Map;

  import javassist.NotFoundException;

  public class main {

  public static void main(String[] args) throws Exception {

  try {

  ClassPool pool = ClassPool.getDefault();

  //指定class所在的路径

  pool.insertClassPath("C:\rike.jar");

  //指定引入的包,这里不需要,所以注释掉

  //pool.importPackage("dialog.DialogUtils");

  //pool.importPackage("common.ListenerUtils");

  //pool.importPackage("java.util.Map");

  //指定要修改class的完整类名

  CtClass cc = pool.get("aggressor.dialogs.WindowsExecutableDialog");

  //设置要修改的方法需要的参数,没有参数可以不设置

  CtClass[] param = new CtClass[5];

  param[0] = pool.get("java.util.Map");

  param[1] = pool.get("dialog.DialogUtils");

  param[2] = pool.get("common.ListenerUtils");

  //指定要修改的类方法

  CtMethod m = cc.getDeclaredMethod("dialogAction");

  //如果需要修改参数,使用下面这个

  //CtMethod m = cc.getDeclaredMethod("dialogAction",param);

  //插入新的代码到最前面

  //m.insertBefore("{if(true) return ;}");

  //重新设置方法体

  m.setBody("{System.out.println("hi class1");}");

  //保存到文件里,文件会保持到该工程下

  cc.writeFile();

  } catch (Exception e) {

  e.printStackTrace();

  }

  }

  }