java如何反编译jar包并修改class文件重新打包
作者:帆影匆匆 发布时间:2021-09-20 05:24:26
反编译jar包并修改class文件重新打包
这两天碰到一个需求:需要修改一个jar包中的逻辑代码,并且重新打包
本来是很简单的问题,但是因为这个jar包不是可执行的jar包(没有main方法入口),jar反编译之后又是不能通过idea重新打包,因为jar是混乱的
所以费了点时间,在此记录下
解决思路
反编译jar包
首先用一些反编译工具类似 jad-gui 之类的 ,将项目反编译成java文件包
示例的jar包并不是业务真正使用,只是写博客demo,假设这个包就叫 demo.jar
这时候导出为java文件即可
用javac 编译成class文件
注意这里容易出问题,因为当前java文件可能有一些依赖其他jar包的代码,那就需要一个一个引入
# 最后必须以 : 结束
# 如果有编译问题可以尝试 -Xlint:unchecked 这个参数
javac -classpath demo.jar:依赖jar包路径1:依赖jar包路径2: Demo.java
此时会在当前运行目录下生成 Demo.class
此时目录结构如下(请忽略和上图jad-gui的不匹配)
- demo
- META-INF
MANIFEST.MF
- com
- demo
demo.class
打jar包
# 在demo文件夹下运行
# 最后这个 . 代表当前目录所有文件
jar cvfm Demo.jar META-INF/MANIFEST.MF .
大功告成 :
jar包反编译后修改源码再编译
1. 场景
需要对当前的jar包功能进行修改,但是没有源码
两种方式:
通过反编译软件如JD-GUI或其他Java开发常用的IDE如IDEA查看源代码,创建新工程,按照文件结构逐个将文件源码复制粘贴到工程中,再根据个人需求进行修改、编译等。
通过反编译软件JD-GUI直接保存成源码格式的工程文件,再通过IDEA打开工程,进行必要的配置后,再根据需求进行修改编译。
很明显第一种方式比较费时,选用第二种方式。
2. 详细步骤
2.1 查看源码
如果仅仅是查看源代码的话,有两种方式:
方式一:
直接通过jd-gui打开jar文件即可。
方式二:
通过IDEA的External Libraries查看。在IDEA中通过Project Structure将需要查看的jar包添加到Libraries,之后就可以查看了。
第二种方式虽然稍微麻烦一点,但如果只是查看源码的话,个人更倾向第二种。
2.2 生成源文件
借助jd-gui可以直接生成**.java**源文件。通过菜单File -> Save All Sources就可以生成源文件压缩包。
注:查看生成的源码文件中有一些多余的注释,如行号及一些元数据信息,可以通过修改jd-gui的偏好设置重新生成。
2.3 构建项目
通过IDEA直接打开源文件;
创建src目录,将源文件方法到src下,根据报错信息,修改工程的外部引用;
2.4 编译成jar包
两种类型可以选择:Empty可以不设置主类,适用于编译没有主类的jar包;
来源:https://blog.csdn.net/weixin_39660224/article/details/106722129


猜你喜欢
- 如题,记录一些平常开发用的pom文件细节1.使用parent父类引用,解决依赖版本号不确定时自动匹配的问题<parent> &n
- 什么是泛型Java泛型(generics)是JDK5中引入的一个新特性,泛型提供了 编译时类型安全监测机制,该机制允许我们在编译时检测到非法
- 一段看似平平无奇的代码Classroom classroom = this.getOne( Wrappers.<Class
- 消息的可靠投递在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我们提供了两种方式用
- 1、题目给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。示例:提示:你可以假设 k 总是有效的,在输入数组不为空
- 总结:对应某个类的实例化的对象tc, 遍历获取所有属性(子成员)的方法(采用反射):Type t = tc.GetType();//获得该类
- 1. eclipse的git插件安装与配置1.1 git插件安装新版本的eclipse已经自带了GIt了,就不用安装了。老版本的eclips
- 代码很简单,功能也很简单,这里就不多废话了#include<stdio.h>int main(){ char ku[16]={&
- Android:控件GridView的使用如果是列表(单列多行形式)的使用ListView,如果是多行多列网状形式的优先使用GridView
- 先看看效果Like This↓一、公共WiFi 公用电脑什么的在我们日常在线上工作、玩耍时,不论开电脑、登录淘宝、玩网游统统都会用到键盘输入
- 一、常用的单位:相对单位主要有:px、sp、dp绝对单位主要有:pt、in、mm二、单位应用总结:一般用相对单位,而不是绝对单位1、字体的大
- 目录一 首先我们的去知道什么是反射?二(刨根问底)知道是什么还需要知道什么“成分”组成反射?2.1 Class 对象的获取及使用2.2 拿到
- 前 言App数据持久化功能是每个App必不可少的功能,而Android最常用的数据持久化方式主要有以下的五种方式:使用SharedPrefe
- 本文实例为大家分享了java使用Cookie判断用户登录情况的方法,供大家参考,具体内容如下1.判断是否登录public boolean i
- 前言今天在逛某知名论坛的时候,看到一篇"请不要使用包装类型,避免造成性能损失"的文章。一下子就吸引了我的注意。大意就是,
- 1. 异常1.1 try…catch异常处理try catch的异常处理的格式写法 :try{ &nbs
- SpringBoot-JPA删除不成功,只执行了查询语句今天使用JPA自定义了一个删除方法deleteByUserIdAndCommentI
- C#重绘checkbox生成滑动开关,供大家参考,具体内容如下通过调用checkbox控件的paint事件,在重绘事件里判断checked属
- 分析:label标签控件是主线程创建的,不能直接从另一个线程访问.可以这样认为:不能跨线程直接访问控件;最简单的办法就是:using Sys
- 本文实例讲述了Android编程实现对电池状态的监视功能。分享给大家供大家参考,具体如下:最近在开发一个与GPS相关的项目,因为其中涉及到了