只有jar包如何调试修改JDK底层源码

背景

有时候在阅读JDK源码的时候,需要调试修改源码,但又只有jar包。这个时候我们可以借助JAVA的endorsed技术。在官方文档如下描述。

Specifying the -Djava.endorsed.dirs=lib/endorsed system property on the  Java command line will force the JVM to prefer any library  it finds in the endorsed directory over its own system libraries. Copying the jars into $JAVA_HOME/jre/lib/endorsed will do the same  thing.

也就是说我们将自己写好的jar包放在endorsed目录下,就可以在遇到与jdk源码冲突时,优先使用我们自己的类。

实战(以修改JDK源码中ObjectStreamClass为例)

定位endorsed目录

String property = System.getProperty("java.endorsed.dirs");
System.out.println(property);

或者时在启动的时候指定endorsed目录

-Djava.endorsed.dirs=C:\Users\admin\mmmm\

创建与JDK中ObjectStreamClass对应的同名自定义类。

以下时我修改源码的地方

编译生成jar包具体步骤如下,也可使用jar命令打包成jar包,自行选择,此处使用idea工具

使用生成的jar包 

将上一步最后生成的jar包放在定位到的endorsed目录下,即可调试修改后的源码

验证

以下测试代码

B b = new B();
b.i = 2;
b.s = "b";
FileOutputStream fileOutputStream1 = new FileOutputStream("temp");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream1);
objectOutputStream.writeObject(b);
fileOutputStream1.close();
//通过文件读取obj
FileInputStream fileInputStream1 = new FileInputStream("temp");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream1);
B b2 = (B) objectInputStream.readObject();
fileInputStream1.close();
System.out.println(b2.i);
System.out.println(b2.s);
class B implements Externalizable {private static final long serialVersionUID = 1L;//必须要有公开无参构造函数。否则报错
//    public B() {
//        System.out.println("调用无参那构造方法B");
//
//    }int i;String s;@Overridepublic void writeExternal(ObjectOutput out) throws IOException {}@Overridepublic void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {}
}

在复制到endorsed目录之前

复制到endorsed目录之后

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flink1.18.0 flink维表join新思路

以往常见实现 通过Lookup join来实现维表join 弊端: 虽然缓存可以减轻维表负担,但是如果事实表数据量很大,每秒千万条,维度表只有百万条,也就是说 你会看到大量的无法关联的数据仍然需要查询维度表. cache缓存千万数据量内存压力又比较大, 那么怎么减轻维表数据库压力,还能做…

Python (十七) __name__ == ‘__main__‘ 作用

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

如何访问GitHub快的飞起?两步解决访问超时GitHub,无法访问GitHub的问题

1.查找国内访问比较快的IP 站长工具网址: https://tool.chinaz.com 测速链接: https://tool.chinaz.com/speedtest/github.com 输入 github.com 点击查看分析 往下滑动,找一个比较快的IP,然后去修改hosts配置文件 (例如&#xff…

DZ-200系列中间继电器 板后不带底座 DZY-212X DC220V JOSEF约瑟

DZY-200系列中间继电器 系列型号: DZY-201中间继电器 DZY-222中间继电器 DZY-202中间继电器 DZY-203中间继电器 DZY-204中间继电器 DZY-205中间继电器 DZY-206中间继电器 DZY-207中间继电器 DZY-208中间继电器 DZY-209中间继电器 DZY-210中间继电器 DZY-211中间继电…

查看进程对应的路径查看端口号对应的进程ubuntu 安装ssh共享WiFi设置MyBatis 使用map类型作为参数,复杂查询(导出数据)

Linux 查询当前进程所在的路径 top 命令查询相应的进程号pid ps -ef |grep 进程名 lsof -I:端口号 netstat -anp|grep 端口号 cd /proc/进程id cwd 进程运行目录 exe 执行程序的绝对路径 cmdline 程序运行时输入的命令行命令 environ 记录了进程运行时的环境变量 fd 目录下是进…

物联网与低代码: 连接人与数字世界的无限可能

物联网(Internet of Things, IoT)和低代码开发平台的结合,为我们开启了连接物理和数字世界的新时代。通过低代码的简洁、高效的开发方式,我们能够更快速地构建智能化的物联网应用,实现智慧城市、智能家居、工业自动化等多个领域的创新和发展。…

@DS注解配合@Transactional不生效

本来好好的项目启动突然报了一个异常: PostgreSQL报错问题如何解决【ERROR: relation " " does not exist】项目中使用了两个数据源,一个是 postgresql,一个是 mysql,报错的表是在 mysql,但是明明没改过代码…

vue无法获取dom

处理过程 watch监听值变化 index.js:33 [Vue warn]: Error in callback for watcher "$store.state.modelsStorageUrl": "TypeError: Cannot set properties of undefined (setting modelScene)"watch: {"$store.state.modelsStorageUrl":{ha…

最优化理论期末复习笔记 Part 1

数学基础线性代数 从行的角度从列的角度行列式的几何解释向量范数和矩阵范数 向量范数矩阵范数的更强的性质的意义 几种向量范数诱导的矩阵范数 1 范数诱导的矩阵范数无穷范数诱导的矩阵范数2 范数诱导的矩阵范数 各种范数之间的等价性向量与矩阵序列的收敛性 函数的可微性与展…

法线贴图可以实现什么样的3D效果

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 在 3D 建模中,曲面由多边形表示。照明计算是基于这些多边…

4《数据结构》

文章目录 绪论逻辑结构存储结构【物理结构】顺序和链式存储区别顺序表和数组区别数组和链表的区别链表结点概念链表为空条件链表文章http://t.csdnimg.cn/dssVK二叉树B树B树【MYSQL索引默认数据结构】B树和B树区别冒泡排序插排选排快排 绪论 数据结构:研究非数值计…

【计算机算法设计与分析】n皇后问题(C++_回溯法)

文章目录 题目描述测试样例算法原理算法实现参考资料 题目描述 在nxn格的棋盘上放置彼此不受攻击的n格皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在nxn格的棋盘上放置n个皇后,任何2个皇后不放在同…

《掌握需求优先级排序,成功项目从此起步》

需求优先级排序是软件开发过程中至关重要的一环。通过合理的需求优先级排序,可以更好地把握项目进度,避免在后期因为需求的变更而造成项目延期或成本超支等问题。下面,本文将从需求的角度出发,探讨如何进行需求优先级排序。 一、…

Css中默认与继承

initial默认样式: initial 用于设置 Css 属性为默认值 h1 {color: initial; }如display或position不能被设置为initial,因为有默认属性。例如:display:inline inherit继承样式: inherit 用于设置 Css 属性应从父元素继承 di…

国产服务器操作系统PXE安装脚本 可重复执行(rc08版本)

执行效果如下: #!/bin/bash #Date:2023/12/25 #Func:一键部署pxe服务器 #Author:Zhanghaodong #Version:2023.12.25.05 #Note:仅适用x86架构uefi安装 # 1.此脚本可多次重复执行。 # 2.如遇到某个服务异常退出,检查响应状态码排错后&#xff0c…

VINS-MONO拓展2----更快地makeHessian矩阵

1. 目标 完成大作业T2 作业提示: 多线程方法主要包括以下几种(参考博客): MPI(多主机多线程开发),OpenMP(为单主机多线程开发而设计)SSE(主要增强CPU浮点运算的能力)CUDAStream processing, 之前已经了解过std::thread和pthread,拓展1…

【持续学习系列(七)】Gradient Episodic Memory for Continual Learning

一、论文信息 1 标题 Gradient Episodic Memory for Continual Learning 2 作者 David Lopez-Paz and Marc’Aurelio Ranzato 3 研究机构 Facebook Artificial Intelligence Research 二、主要内容 论文主要探讨了持续学习(continual learning)的…

SpringBoot实用开发(九)-- RedisTemplate处理ZSet类型的数据

目录 1.添加元素(有序集合是按照元素的score值由小到大进行排列) 2.删除对应的value,value可以为多个值

mybatis批量同时更新或者插入数据

可以使用 MySQL 的 INSERT INTO … ON DUPLICATE KEY UPDATE 语句来实现批量插入更新。 假设有一个表 ams_storageCargo,其主键为 id,可以将数据列表存储在一个 List 对象中,然后使用 MyBatis 的 foreach 标签进行循环插入,同时使…

工作中人员离岗识别摄像机

工作中人员离岗识别摄像机是一种基于人工智能技术的智能监控设备,能够实时识别员工离岗状态并进行记录。这种摄像机通常配备了高清摄像头、深度学习算法和数据处理系统,可以精准地监测员工的行为,提高企业的管理效率和安全性。 工作中人员离岗…