<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.28.0-GA</version>
</dependency>
public static void main(String[] args) {
// 获取 Jar 包
ClassPool classPool = ClassPool.getDefault();
classPool.insertClassPath("D:\\test\\test.jar");
// 参数为jar包里的 .class 文件全类名,对应要修改的方法的类
CtClass c2 = classPool.getCtClass("com.xqlee.A");
// A类有参方法
CtMethod aMethod = c2.getDeclaredMethod("methodName", new CtClass[]{classPool.makeClass("java.lang.String")});
// 重置方法体,方法体里面的参数要用$1,$2...代替, 涉及的类要用全类名
aMethod.setBody("{ return $1; }");
// A类无参方法
CtMethod bMethod = c2.getDeclaredMethod("methodName");
// 重置方法体,涉及的类要用全类名
bMethod.setBody("{//方法体内容}");
c2.writeFile();
}
提示:
- 修改后的class文件生成到当前项目中,对应的包是他自己的包,例如上面会生成到当前项目的 com.xqlee包里面
- 注意修改的方法如果有入参,则方法名和参数必须与class里面一致才行否则报错没找到类(可以通过jd-gui等可视化反编译工具先查看清楚class里面的方法和参数列表)
http://blog.xqlee.com/article/1121.html