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如何反编译jar包并修改class文件重新打包

这时候导出为java文件即可

java如何反编译jar包并修改class文件重新打包

用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,之后就可以查看了。

java如何反编译jar包并修改class文件重新打包

java如何反编译jar包并修改class文件重新打包

第二种方式虽然稍微麻烦一点,但如果只是查看源码的话,个人更倾向第二种。

2.2 生成源文件

借助jd-gui可以直接生成**.java**源文件。通过菜单File -> Save All Sources就可以生成源文件压缩包。

java如何反编译jar包并修改class文件重新打包

注:查看生成的源码文件中有一些多余的注释,如行号及一些元数据信息,可以通过修改jd-gui的偏好设置重新生成。

java如何反编译jar包并修改class文件重新打包

2.3 构建项目

通过IDEA直接打开源文件;

java如何反编译jar包并修改class文件重新打包

创建src目录,将源文件方法到src下,根据报错信息,修改工程的外部引用;

2.4 编译成jar包

java如何反编译jar包并修改class文件重新打包

两种类型可以选择:Empty可以不设置主类,适用于编译没有主类的jar包;

java如何反编译jar包并修改class文件重新打包

来源:https://blog.csdn.net/weixin_39660224/article/details/106722129

标签:java,反编译,jar包,class,重新打包
0
投稿

猜你喜欢

  • C#中using关键字的使用方法示例

    2023-07-30 14:17:02
  • Java 添加超链接到 Word 文档方法详解

    2023-01-29 08:49:30
  • IDEA设置Tab选项卡快速的操作

    2022-07-15 18:20:31
  • 在SpringBoot中整合使用Netty框架的详细教程

    2023-03-26 23:59:53
  • 详解Java接口签名(Signature)实现方案

    2022-02-05 09:28:57
  • Spring main方法中如何调用Dao层和Service层的方法

    2023-11-28 23:15:19
  • Spring MVC 处理一个请求的流程

    2021-12-19 18:39:39
  • Spring Cloud Gateway(读取、修改 Request Body)的操作

    2023-11-09 19:25:46
  • Spring基于注解的缓存声明深入探究

    2023-01-20 13:26:06
  • Java并发编程之volatile与JMM多线程内存模型

    2023-10-19 12:13:48
  • Java 7大常见排序方法实例详解

    2022-01-09 05:16:46
  • 详解SpringBoot和SpringBatch 使用

    2023-08-17 19:00:38
  • Javaweb中Request获取表单数据的四种方法详解

    2023-10-07 03:07:02
  • 详解关于SpringBoot的外部化配置使用记录

    2023-08-10 03:54:54
  • Java原生服务器接收上传文件 不使用MultipartFile类

    2023-11-09 19:31:36
  • go打包aar及flutter调用aar流程详解

    2023-06-24 17:39:21
  • 使用SpringBoot 配置Oracle和H2双数据源及问题

    2023-10-04 14:06:11
  • Kryo框架使用方法代码示例

    2021-05-30 15:46:05
  • 浅谈Java字符串比较的三种方法

    2023-05-13 12:26:51
  • Java基础学习之ArrayList类概述与常用方法

    2023-03-13 02:15:24
  • asp之家 软件编程 m.aspxhome.com