反编译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();
}
}
}