每日一博 - 重新定义JAR中的类或方法

文章目录

  • 概述
  • 方式一 : 项目覆写相同包结构的类
  • 方式二: 魔改Jar包中的类
  • 方案对比
    • 方案一:在项目中新增第三方包路径
    • 方案二:替换JAR包中的类文件

在这里插入图片描述


概述

在一些情况下,我们可能需要定制第三方库的行为,但却无法直接修改其源代码或者重新打包JAR文件。这可能是因为第三方库受到了严格的许可协议限制,或者我们无法获取源代码。

在这里插入图片描述

方式一 : 项目覆写相同包结构的类

  1. 确定目标方法所在的类和路径:首先,确定要重写的方法所在的类以及其在JAR包中的路径。

  2. 在src目录下创建同包名同类名的类文件:在你的项目的src目录下,按照原始类所在的包结构,在相同的路径下创建一个同名的Java类文件。

  3. 复制原始类的代码:打开JAR包,找到目标类的源代码,将其代码复制到你新建的同名类文件中。

  4. 修改目标方法:在新建的类文件中,找到要重写的方法,并进行相应的修改。可以根据需求修改方法中的代码,但是要注意保持方法签名(方法名、参数列表、返回类型)不变。

  5. 添加新方法(可选):如果需要,在新建的类文件中添加新的方法来扩展功能,但是不要删除原始类中已有的方法,以确保兼容性。

  6. 编译和部署:完成修改后,编译项目,并将编译后的类文件部署到你的应用程序中。确保编译输出的类文件能够覆盖JAR包中的原始类。

通过这些步骤,可以实现对JAR包中方法的重写,使得应用程序能够使用修改后的方法而不是JAR包中原始的方法。这种方法不会直接修改JAR包,而是通过项目的编译输出来覆盖原始类,保持了JAR包的完整性。


方式二: 魔改Jar包中的类

在不影响项目目录结构的情况下,可以使用如下方式替换JAR包中的类:

  1. 准备重写的类文件:按照上面的步骤,在项目的src目录下创建同包名同类名的Java类文件,并修改其中的代码。

  2. 编译Java类文件:使用Java编译器(例如javac命令)编译Java类文件,生成对应的.class文件。

  3. 创建临时文件夹:在桌面或其他地方创建一个临时文件夹,用于存放编译好的.class文件。

  4. 打开JAR包所在的文件目录:找到包含JAR包的文件目录,并将JAR包复制到临时文件夹中。

  5. 使用压缩软件打开JAR包:使用压缩软件(如Bandzip)打开JAR包,以便编辑其中的内容。

  6. 替换类文件:在压缩软件中,找到需要替换的类文件,并删除它。然后将步骤2中编译好的.class文件复制到JAR包中,确保文件路径和包名与原始类文件相同。

  7. 保存并关闭压缩软件:保存对JAR包的修改,并关闭压缩软件。

  8. 删除临时文件夹中的.class文件:确认替换已完成后,可以删除临时文件夹中的.class文件。

通过这种方式,可以在不影响项目目录结构的情况下替换JAR包中的类文件,实现对类和方法的定制化。


方案对比

方案一:在项目中新增第三方包路径

优点:

  1. 简单快捷:实现起来相对简单,不需要重新打包JAR文件,只需要在项目中新增对应的包路径和类即可。
  2. 保留原始JAR包完整性:不对原始JAR包做任何修改,保持了原始JAR包的完整性和稳定性。

缺点:

  1. 项目结构变复杂:在项目中新增第三方包路径会使项目结构变得复杂,增加了维护成本。
  2. 不符合标准实践:这种做法可能会使项目的包结构与标准实践不符,不利于其他开发人员理解和维护。

方案二:替换JAR包中的类文件

优点:

  1. 避免项目结构变化:不会改变项目的包结构,不会使项目变得复杂。
  2. 隐藏了"野包":替换JAR包后,其他开发人员不易发现项目中的变化,不会引起不必要的疑惑。

缺点:

  1. 操作相对复杂:需要手动替换JAR包中的类文件,并重新打包成新的JAR文件,操作相对繁琐。
  2. 可能引起混淆:其他开发人员可能不清楚JAR包被修改过,会造成混淆和困惑。
  3. 潜在风险:修改JAR包可能会破坏原始JAR包的完整性,导致意外的问题出现。

总的来说,选择哪种方案取决于具体情况和偏好。如果项目结构变化对你的团队影响不大,并且你希望保持项目的整洁性,可以选择方案一;如果你更关注隐藏修改细节,避免不必要的疑惑,可以选择方案二。

在任何情况下,最好的做法是尽量从上游解决问题,避免对第三方库做出不必要的修改。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/541751.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

部署HDFS集群(完全分布式模式、hadoop用户控制集群、hadoop-3.3.4+安装包)

目录 前置 一、上传&解压 (一 )上传 (二)解压 二、修改配置文件 (一)配置workers文件 (二)配置hadoop-env.sh文件 (三)配置core-site.xml文件 &…

人工智能|机器学习——基于机器学习的信用卡办卡意愿模型预测项目

一、背景介绍 在金融领域,了解客户的信用卡办卡意愿对于银行和金融机构至关重要。借助机器学习技术,我们可以根据客户的历史数据和行为模式预测其是否有办理信用卡的倾向。本项目通过Python中的机器学习库,构建了两个常用的分类模型&#xff…

自定义创建真实项目vue2项目

1. 创建 vue create 项目名 2. 选择自定义 3. 勾选以下必备选项 4.选择使用vue2 5. 选择哈希模式(n); css选择Less 6. ESLint校验 选择 7. 保存(按照默认) 8. 在哪里添加ESLint文件 9. 要不要把这个改成将来的预设&am…

底层开发必知的三个内存结构概念

大家好,今天给大家介绍底层开发必知的三个内存结构概念,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。 在底层开发中,以下是三个关键的内存结构概念&…

linux进阶篇:性能监控工具——vmstat命令详细讲解

Linux性能监控工具:vmstat命令详细讲解 vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析…

【Godot4.2】CanvasItem绘图函数全解析 - 7.自定义节点TextBoard

概述 之前发布的几篇文章几乎阐述了CanvasItem绘图函数最基础的内容。 本篇结合draw_style_box()和TextParagraph类,自定义了一个可以自适应宽高显示多行文本,且带有一个样式盒作为背景的文字板节点TextBoard。 系列目录 0.概述1.绘制简单图形2.设定绘…

13 Php学习:面向对象

PHP 面向对象 面向对象(Object-Oriented,简称 OO)是一种编程思想和方法,它将程序中的数据和操作数据的方法封装在一起,形成"对象",并通过对象之间的交互和消息传递来完成程序的功能。面向对象编…

分类预测 | Matlab实现基于迁移学习和GASF-CNN-Mutilhead-Attention格拉姆角场和卷积网络多头注意力机制多特征分类预测/故障识别

分类预测 | Matlab实现基于迁移学习和GASF-CNN-Mutilhead-Attention格拉姆角场和卷积网络多头注意力机制多特征分类预测/故障识别 目录 分类预测 | Matlab实现基于迁移学习和GASF-CNN-Mutilhead-Attention格拉姆角场和卷积网络多头注意力机制多特征分类预测/故障识别分类效果基…

卷积神经网络(CNN)笔记——多图深入理解

梗直哥、梗直哥丶的个人空间-梗直哥丶个人主页-哔哩哔哩视频 过去十年,卷积神经网络(CNN)如同科技领域的明星,以其卓越的表现撑起了人工智能的半边天。这种创新的网络模型,不仅在计算机视觉、语音识别等传统领域大放异彩,更为人工智能的快速发展和广泛应用奠定了坚实的基础。…

【软件设计师知识点】一、计算机系统基础知识

文章目录 冯诺依曼计算机CPUCPU 的功能CPU 的组成 数据表示进制转换单位换算定点数浮点小数IEEE 754标准浮点数的运算 校验码奇偶校验码海明码循环冗余校验码(CRC) 指令系统指令格式寻址方式指令集指令流水线 存储系统存储器的层次化结构存储器的分类相联…

MYBATIS获取参数值

MYBATIS最核心的莫过于动态的获取各种的参数值, 为了将来更好的使用MYBATIS进行开发, 我们必须先打好 "获取参数值" 这一基础 一. MYBATIS获取参数值的两种情况: 1.${} 实质:字符串的拼接 注解:${}使用的字符串拼接的方式拼接SQL语句, 所以, 如果其中出现了字符串…

【Golang学习笔记】从零开始搭建一个Web框架(二)

文章目录 模块化路由前缀树路由 前情提示: 【Golang学习笔记】从零开始搭建一个Web框架(一)-CSDN博客 模块化路由 路由在kilon.go文件中导致路由和引擎交织在一起,如果要实现路由功能的拓展增强,那将会非常麻烦&…

Python项目移动文件夹后出现ModuleNotFoundError: No module named

文章目录 0 问题再现1 问题原因2 结局办法2.1 如果是使用编译器运行2.2 如果是在linux环境下,使用命令运行 0 问题再现 移动Python的项目文件夹后,代码出现模块引用未知的问题。 1 问题原因 移动Python项目后,source root(项目…

创新者指南

创新者指南 怎么把一个模糊的想法变为成功的商业模式。在高度不确定的商业环境下,怎样验证创新想法是否有商业价值,还有怎么用较低的成本打造产品,并推向市场。作者为我们总结出3个有用的策略(测试方法)和几个关键步骤…

从零实现诗词GPT大模型:专栏内容规划

一、前情介绍 本系列文章将从头编写一个类GPT的深度学习模型,并在诗词数据集上进行训练,从而可以进行诗词创作。 本次实现的类GPT模型,可以在kaggle上使用免费GPU进行训练,并可以在自己的电脑上进行推理,整个学习过程…

前端vue: 使用ElementUI适配国际化

i18n介绍 i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称。 前端国际化步骤 1、安装i18n插件 安装插件时候,注意必须指定版本号,不然安装会报错。 npm i vue-i1…

查天气(Vue.js,Element UI)

演示图 几点注意 有亿点简陋,凑合能用,button一定要 !important 覆盖原本的 element ui ,不然无效axios回调函数中 this 指向改变了,需要额外的保存一份服务器返回的数据比较复杂时,获取的时候需要注意层级结构method…

分类预测 | Matlab实现RIME-LSSVM霜冰算法优化最小二乘支持向量机数据分类预测

分类预测 | Matlab实现RIME-LSSVM霜冰算法优化最小二乘支持向量机数据分类预测 目录 分类预测 | Matlab实现RIME-LSSVM霜冰算法优化最小二乘支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现RIME-LSSVM霜冰算法优化最小二乘支持向量机数…

标准更新丨美国发布玩具安全标准ASTM F963-23

2023年10月13日,美国材料试验协会 (ASTM)发布了玩具安全标准ASTM F963-23。新版标准主要修订了声响、电池可触及性、膨胀材料和弹射玩具的技术要求,另外,澄清和调整了邻苯二甲酸酯、玩具基材重金属的豁免以及溯源标签的要求,使其保…

vim相关指令

vim的各种模式及其转换关系图 vim 默认处于命令模式!!! 模式之间转换的指令 除【命令模式】之外,其它模式要切换到【命令模式】,只需要无脑 ESC 即可!!! [ 命令模式 ] 切换至 [ 插…