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

 更新时间:2022年03月09日 10:36:21   作者:帆影匆匆  
这篇文章主要介绍了java如何反编译jar包并修改class文件重新打包,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

反编译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包;

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java字符串拼接效率测试过程解析

    Java字符串拼接效率测试过程解析

    这篇文章主要介绍了Java字符串拼接效率测试过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java中减少if-else的几种方式

    Java中减少if-else的几种方式

    if判断语句是很多编程语言的重要组成部分,但是,若我们最终编写了大量嵌套的if语句,这将使得我们的代码更加复杂和难以维护,本文主要介绍了Java中减少if-else的几种方式,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • SpringBoot项目中的favicon.ico图标无法显示问题及解决

    SpringBoot项目中的favicon.ico图标无法显示问题及解决

    这篇文章主要介绍了SpringBoot项目中的favicon.ico图标无法显示问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • springboot vue前后端接口测试树结点添加功能

    springboot vue前后端接口测试树结点添加功能

    这篇文章主要为大家介绍了springboot vue前后端接口测试树结点添加功能,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Java发起http请求的完整步骤记录

    Java发起http请求的完整步骤记录

    这篇文章主要给大家介绍了关于Java发起http请求的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • SpringBoot中使用Ehcache的详细教程

    SpringBoot中使用Ehcache的详细教程

    EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认的 CacheProvider。这篇文章主要介绍了SpringBoot中使用Ehcache的相关知识,需要的朋友可以参考下
    2020-08-08
  • Java实现简单的扫雷小程序

    Java实现简单的扫雷小程序

    这篇文章主要为大家详细介绍了Java实现简单的扫雷小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • Java中security与shiro的区别详解

    Java中security与shiro的区别详解

    这篇文章主要介绍了Java中security与shiro的区别详解,Spring Security在架构上将认证与授权分离,并提供了扩展点,它是一个轻量级的安全框架,它确保基于Spring的应用程序提供身份验证和授权支持,需要的朋友可以参考下
    2023-08-08
  • MyBatis3源码解析之如何获取数据源详解

    MyBatis3源码解析之如何获取数据源详解

    用myBatis3与spring整合的时候,我们可以通过多种方式获取数据源,下面这篇文章主要给大家介绍了关于MyBatis3源码解析之如何获取数据源的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • 修改若依框架Token的过期时间问题

    修改若依框架Token的过期时间问题

    本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎支持脚本之家
    2025-02-02

最新评论