JAVA-如何修改源码(重写JAR包里的类)

article/2025/9/25 12:19:23

        今天写代码的时候发现alibaba的druid工具对postgresql数据库的union all语法支持不够完善,具体场景:

select id,name from a

union all

(select id,name from b order by id);

该语法在druid工具中被解析为:

select id,name from a

union all

select id,name from b

order by id;

显而易见,解析后将括号"()"去掉了,去掉之后SQL语义发生了改变,本意是想a表与根据id排序后的b表进行union all,但是解析之后语义为a表与b表union all之后再进行排序,SQL语义发生了巨大变化。那么如何修复呢?目前有三种方法。

第一种:给druid官方提issue(等他们解决,猴年马月了,不适用)

第二种:将使用版本的jar包源码下载下来进行正确修改,编译,上传到私服进行引用(如果遇到版本升级,可能之前修改的就不再生效了)

(建议使用)

第三种:找到要修改的源码的全路径,在项目路径下新建一个相同全路径的类,将源码贴入新建的类中,然后在该类中对相应代码进行正确修改即可,需要注意的一个问题,版本升级时需要注意,该新建的类需要在最新版本的基础之上进行正确修改,防止串版本问题!另外,做好备注,防止后续开发人员不理解相关代码。

最后说一下,项目新建类覆盖源码的原理

1、maven遇到同名类,在pom中先声明的先加载
2、本地类的加载顺序,优先于依赖包中的类

加载顺序实验

maven在遇到同名类时,加载顺序如何?我们做实验测试下。

出现同名类的情况如下,不同包下的MyApi类完全一样:
1、demo应用依赖了api-v1的MyApi类
2、demo应用依赖了api-v2的MyApi类

api-v1版本的代码如下:

api-v2版本的代码如下:

demo调用如下:

package org.example.demo;import org.example.api.MyApi;/*** @author xxx* @date 2022/4/22 11:22 下午*/
public class App {public static void main(String[] args) {MyApi myApi = new MyApi();myApi.echo();}
}

当pom中的引入顺序是下面这种情况,控制台输出:api-v1:

    <dependencies><dependency><groupId>org.example.api</groupId><artifactId>api-v1</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.example.api</groupId><artifactId>api-v2</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>

当pom中的引入顺序是下面这种情况,控制台输出:api-v2:

    <dependencies><dependency><groupId>org.example.api</groupId><artifactId>api-v2</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.example.api</groupId><artifactId>api-v1</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>

再做一个实验,在demo工程本地也新建一个同名的MyApi类:

package org.example.api;/*** @author xxx* @date 2022/4/22 11:25 下午*/
public class MyApi {public void echo() {System.out.println("api-demo");}
}

目录结构如下:

再次执行main函数,控制台输出:api-demo

才疏学浅,大佬们多指教!


http://chatgpt.dhexx.cn/article/duYvLTY1.shtml

相关文章

堆的操作(Java)

文章目录 1.堆的存储方式2.堆的创建2.1向下调整2.2向上调整 3.堆的操作3.1元素插入堆3.2取堆顶元素3.3删除堆顶元素 1.堆的存储方式 由堆的概念可知&#xff0c;堆是一棵完全二叉树&#xff0c;因此可以层序的规则采用顺序的方式来存储堆。 注意&#xff1a; 对于非完全二叉树…

[Java]堆

目录 一、堆的概念 二、大小根堆的建立 三、 堆的调整 1. 向下调整 2. 向上调整 三、堆的删除与插入 一、堆的概念 堆可以看做一个完全二叉树&#xff0c;如果有一个关键码的集合K {k0&#xff0c;k1&#xff0c; k2&#xff0c;…&#xff0c;kn-1}&#xff0c;把它的所…

JVM-堆

文章目录 堆&#xff0c;是运行是数据区的一部分堆内存分区&#xff1a;JAVA堆区细分&#xff1a; 设置堆内存大小与OOM设置堆空间大小 OOM Outof Memory Error 举例!!!图解对象分配过程Minor GC、Major GC、Full GC年轻代 GC&#xff08;Minor GC&#xff09;触发机制老年代 G…

jvm堆大小的设置

问题引入&#xff1a; -Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio3&#xff0c;,其最小内存值和Survivor区总大小分别是&#xff08;10240m 2048m&#xff09;&#xff1b; 解析&#xff1a; -Xmx&#xff1a;最大堆大小 -Xms&#xff1a;初始堆大小 -Xmn:年轻…

如何修改java中堆、栈空间的默认大小

1、修改堆、栈空间大小的命令 在命令行中输入java -X可以得到设置java堆大小和栈大小的命令 2、修改java运行时的堆和栈空间 进入界面后 按AltV 3、检验堆空间修改 3.1 测试类 public class StackTest {public static void main(String[] args) {//返回Java虚拟机中的堆内存…

java 堆设置

Young&#xff1a;主要是用来存放新生的对象。&#xff08;Eden、survivorSpaces(from、To)&#xff09; Old&#xff1a;主要存放应用程序中生命周期长的内存对象。 Permanent&#xff1a;是指内存的永久保存区域&#xff0c;主要存放Class和Meta的信息,Class在被 Load的时候…

Java堆内存设置

堆内存设置 原理 JVM堆内存分为2块&#xff1a;永久空间和堆空间。 永久即持久代&#xff08;Permanent Generation&#xff09;&#xff0c;主要存放的是Java类定义信息&#xff0c;与垃圾收集器要收集的Java对象关系不大。Heap {Old NEW {Eden&#xff0c;from&#xff0…

OBEX(一)

一、概述 1、OBEX v2.0&#xff08;v2.0版本开始OBEX直接在L2CAP上传输&#xff0c;v2.0版本以前OBEX在RFCOMM上传输&#xff09; 2、OBEX即Object Exchange Protocol&#xff0c;对象交换协议 3、OBEX协议是典型的client/server request-response模型 4、OBEX v2.0蓝牙协议…

利用docker部署oxidized网络设备备份系统

随着网络设备的增多,通过人手备份网络设备倍感压力,而且效率低。有编程基础的人可能会通过Python的parimiko 或者netmiko 连接到设备操作 把文件通过ftp 上传到FTP服务器, 在通过定时任务,定期自动备份。这个应该是现阶段主流非人民币网络玩家的最优解决方案。 今天我们来看看…

网络自动化运维第一篇 自动化备份网络配置

网络设备厂商众多&#xff0c;各种安全厂商&#xff0c;网络厂商&#xff0c;负载均衡厂商&#xff0c;如果想实现自动化备份配置&#xff0c;可以自己写python脚本。如果网络设备厂商多&#xff0c;自己写python 非常耗费时间精力。偶然在网上发现了oxidized 非常好用&#xf…

.odex文件的反编译

0x00 问题呈现 在分析某手机自带应用时&#xff0c;为了在JEB中反编译&#xff0c;将其adb pull到了电脑上。解压后发现如下文件&#xff1a; APK解压目录列表 惊奇的发现该APK包中没有dex文件&#xff0c;一开始特别疑惑没有dex文件&#xff0c;也就是没有代码&#xff0c;那…

ZeroDivisionError: integer division or modulo by zero

这里的错误就是由于数据集太小。 # 2. Split into train / validation partitionsn_val int(len(dataset) * val_percent)n_train len(dataset) - n_val#我这里是刚好有10张数据集然后其中一张被拆分为验证集导致训练集太小&#xff0c;从而报错。

反编译odex

需要工具&#xff1a; 1、baksmali-x.x.x.jar2、smali-x.x.x.jar工具下载&#xff1a;https://bitbucket.org/JesusFreke/smali/downloads/ 步骤&#xff1a; 1、odex转smali&#xff1a; java -jar “D:\google\tool\mony_tool\baksmali-2.2.1.jar” deodex SystemUI.odex -…

ZeroDivisionError:Integer division or modulo by zero

docker环境下&#xff0c;多GPU训练 方式&#xff1a;采用nvidia-docker创建容器 另&#xff1a; 在用sudo无法解决sh文件的pemission denied问题时&#xff0c;采用bash替代sudo

deactive(Deactive breakpoint)

deactive怎么译&#xff1f; de-active 原指吊销, 计算机的专用词叫 "去活". 多指停止某指令.吊销&#xff0c;不激活&#xff0c;关闭 三星bc01指令代码 三星手机总复位&#xff0c;在待机状态下输入*2767*3855#需要专门的智能仪器才可以解开手机密码忘记了 一般普…

Oxidized-20180912-docker 版本的网络设备备份系统

Problem Oxidized 非常好用&#xff0c;基本兼容所有网络设备的备份&#xff0c;但是有一个小小小小的问题&#xff0c;就是在 Linux 环境下&#xff0c;默认安装的 Ruby 版本问题为其在离线情况下的安装增添了很多的麻烦和限制。 于是轻量级的 docker 成了不二的选择。 &am…

Oxidized-最好用的网络设备备份系统(三)-双机自动备份

oxidized备份网络配置默认路径为 /root/.config/oxidized/group group分别是不同设备分组 group1 group2 group3 group4 双机自动备份思路: 制作将需要备份的数据先备份到back/bak目录下,再通过打包gz格式放到backup目录下,然后通过远程传输,上传到备份服务器的/usr/…

cas:27025-41-8 Glutathione oxidized氧化型谷胱甘肽 活性氧抑制剂

cas:27025-41-8 Glutathione oxidized氧化型谷胱甘肽 活性氧抑制剂 中文名称&#xff1a;氧化型谷胱甘肽 英文名称&#xff1a;Glutathione oxidized 分子量&#xff1a;612.63 性状&#xff1a;Solid 分子式&#xff1a;C20H32N6O12S2 cas:27025-41-8 别称&#xff1a;…

Oxidized-最好用的网络设备备份系统(二)

上文回顾 书接上文, 看完上篇文章的同学相信大家对这个”oxidized” 有了初步的了解, 有同学对config 配置有些疑惑 我这里简单介绍一下。 --- username: username : 用户名 这个参数不用改,会从router.db读取. password: password : 密码 这个参数也不用改,会从router.db…

整理了一下oxidized+mysql+gitlab,感觉很好用,做个记录

安装oxidized 安装ruby yum install centos-release-scl yum install rh-ruby23 rh-ruby23-ruby-devel scl enable rh-ruby23 bash 安装依赖关系 yum install make cmake sqlite-devel openssl-devel libssh2-devel ruby gcc ruby-devel libicu-devel gcc-c 安装oxidized gem…