javassist 反编译修改jar包里class

教程分享 > Java教程 > 博文分享 (2812) 2024-04-17 12:33:21
某些情况,我们需要对jar进行反编译修改部分代码,通过源码编译太麻烦就直接通过javassist工具对具体的方法进行修改。下面是一些简单javassist使用说明。

一 引入javassist Maven依赖

<dependency>
    <groupId>org.javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.28.0-GA</version>
</dependency>
 

二、编写修改.class文件

public static void main(String[] args) {
        // 获取 Jar 包
        ClassPool classPool = ClassPool.getDefault();
        classPool.insertClassPath("D:\\test\\test.jar");
        // 参数为jar包里的 .class 文件全类名,对应要修改的方法的类
        CtClass c2 = classPool.getCtClass("com.leftso.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.leftso包里面
  • 注意修改的方法如果有入参,则方法名和参数必须与class里面一致才行否则报错没找到类(可以通过jd-gui等可视化反编译工具先查看清楚class里面的方法和参数列表)

三、替换class类

用压缩工具(这里以7z为例)打开jar文件,用生成的A.class 替换原来目录中的A.class文件。替换后可以通过jd-gui工具再次查看。


 

相关文章
某些情况,我们需要对jar进行反编译修改部分代码,通过源码编译太麻烦就直接通过javassist工具对具体的方法进行修改。下面是一些简单javassist使用说明。一 引入javassist M...
GrayLog admin账号修改密码(docker版)由于graylog的admin账号不是配置到数据库中,而是配置到配置文件/etc/graylog/server/server.conf里面...
最近要用到jdeli-imageio包里面一个功能,进行了去水印处理。首先新建一个空白maven项目,并引入javassist依赖 &lt;dependency&gtl; ...
mysql 5.7.9以后废弃了password字段和password()函数;authentication_string:字段表示用户密码,而authenti
mongodb修改数据命令
Linux系统修改静态IP
transmission修改密码,写这篇博客主要是小米路由器刷了padavan固件。固件中transmission需要修改默认密码遇到的问题。以下为修改transmission密码具体步骤
    查看当前系统时间 date    修改当前系统时间 date -s "2018-2-22 19:10:30"    查看硬件时间 hwclock --show    修改硬件时间 hwc...
mongodb数据库linux安装配置用户创建删除修改
eolinker开源版修改数据库配置配置文件目录:eolinker_os/server/RTP/config编辑: vi eo_config.php配置内容:(提示:4.0和5.0只有一些略微区...
Bootstrap 的导航菜单navba的高度修改
工具DiskGenius资源引导文件的.img镜像DiskGenius导入引导文件镜像步骤一打开DiskGenius软件步骤二步骤二选择引导镜像文件导出上图选中文件,对选中文件进行鼠标右键菜单
前言随着项目升级,目前存在一些项目是jdk8的一些是jdk17的,让Jenkins 使用主机编译环境成为了问题。故此使用docker环境来编译项目,分离各个版本
JDK 11 String 新方法使用教程