只有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,一经查实,立即删除!

相关文章

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

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…

法线贴图可以实现什么样的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个皇后不放在同…

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

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

国产服务器操作系统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…

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

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

在Go语言中处理HTTP请求中的Cookie

在Web开发中,Cookie是一种常用的技术,用于在客户端存储数据,并在随后的请求中发送回服务器。Go语言的标准库提供了强大的支持来处理HTTP请求中的Cookie。 首先,让我们了解如何在Go语言中设置Cookie。以下是一个简单的示例&#x…

MySQL基础笔记(4)DQL数据查询语句

DQL用于查找数据库中存放的记录~ 目录 一.语法 二.基础查询 1.查询多个字段 2.设置别名 3.去除重复记录 三.条件查询 1.基础语法 2.常见条件 四.分组查询 1.聚合函数 2.语法 五.排序查询 六.分页查询 附注:DQL执行顺序 1.编写顺序 2.执行顺序 ​​​…

安装阿里云CLI之配置阿里云凭证信息

有时候需要再主机上通过 OpenAPI 的调用访问阿里云,并完成控制,此时就需要在服务器上安装阿里云CLI,并完成账号的设置。 1. 登录阿里云创建账号 1.1 点击阿里云头像 ——》 控制访问 ——》创建一个拥有DNS权限的用户 这个用户不用太多权限…

小程序购物商城搭建开发分析

小程序商城作为现代商业模式的重要组成部分,具有巨大的发展潜力和商业价值。通过搭建一个功能完善、用户友好的小程序商城,您将能够提供便捷的购物体验,吸引更多的用户并实现商业增长。在进行小程序商城开发搭建之前,我们需要对项…

抽象工厂模式(Abstract Factory)

文章目录 定义与类型适用场景优点缺点产品等级结构与产品族抽象工厂代码示例 定义与类型 定义:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,无须指定它们具体的类。 类型:创建型。 适用场景 客户端(应用层&#…

AI提示工程指南

简述: 当今互联网行业对于AI提示工程的需求日益增长,而《AI提示工程指南》是一本旨在满足这种需求的宝贵指南。本指南由一位对AI提示工程充满热情并自学而来的互联网从业者撰写,旨在为行业人员提供一个全面、易懂的参考手册。 这本指南将引领您踏上AI提示工程的旅程,深入探…

DevOps(3)

目录 11.描述root账户? 12.如何在发出命令时打开命令提示符? 14.Linux系统下交换分区的典型大小是多少? 15.什么是符号链接? 11.描述root账户? root账户就像一个系统管理员账户,允许你完全控制系统。 …