只有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;
    @Override
    public void writeExternal(ObjectOutput out) throws IOException {

    }
    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {

    }
}

在复制到endorsed目录之前

复制到endorsed目录之后

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

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

相关文章

后端中的Dao层、Service层、Impl层、utils层、Controller层

Java Dao层 dao层叫数据访问层,全称为data access object,属于一种比较底层,比较基础的操作,具体到对于某个表、某个实体的增删改查,对外提供稳定访问数据库的方法 Mapper:(DAO) 访问数据库&am…

22款奔驰GLS450升级香氛负离子 车载香薰

奔驰原厂香氛系统激活原车自带系统,将香气加藏储物盒中,通过系统调节与出风口相结合,再将香味传达至整个车厢,达到净化车厢空气的效果,让整个车厢更加绿色健康,清新淡雅。星骏汇小许Xjh15863 产品功能&…

Linux--系统安全及应用

1.1账号安全控制 用户账号是计算机使用者的身份凭证或标识,每个要访问系统资源的人,必须凭借其用户账号才能进入计算机。在Linux系统中,提供了多种机制来确保用户账号的正当、安全使用。 1.系统账号清理 在Linux系统中,除了用户手…

pod 基础 2

pod 进阶 探针 poststart prestop pod的生命周期开始: 重启:k8s的pod重启策略 deployment的yaml文件只能是Always pod的yaml三种模式都可以。 OnFailure:只有状态码非0才会重启,正常退出是不重启的 Never:正常退…

由浅入深理解C#中的事件

目录 本文较长,给大家提供了目录,可以直接看自己感兴趣的部分。 前言有关事件的概念示例​ 简单示例​ 标准 .NET 事件模式​ 使用泛型版本的标准 .NET 事件模式​ 补充总结 参考前言 前面介绍了C#中的委托,事件的很多部分都与委托…

sqlserver工具插入表语法into新表问题

文章目录 sqlserver工具插入表语法into新表问题 sqlserver工具插入表语法into新表问题 into新表问题 SELECT 1 AS FID, AS FNUMBER,1 AS FVALUE,A AS FVALUE2,名字 AS FNAME, 你的全名 FFULLNAME INTO t_user_mmINSERT INTO t_user_mm VALUES(2,2,2,B,懒人,懒人咖)INSERT I…

FreeRTOS——内存管理知识总结及实战

1 freeRTOS动态创建与静态创建 动态创建:从FreeRTOS 管理的内存堆中申请创建对象所需的内存,在对象删除后, 这块内存释放回FreeRTOS管理的内存堆中 静态创建:需用户提供各种内存空间,并且使用静态方式占用的内存空间一…

VCoder:大语言模型的眼睛

简介 VCoder的一个视觉编码器,能够帮助MLLM更好地理解和分析图像内容。提高模型在识别图像中的对象、理解图像场景方面的能力。它可以帮助模型显示图片中不同物体的轮廓或深度图(显示物体距离相机的远近)。还能更准确的理解图片中的物体是什…

(Java基础知识综合)

进制转换&#xff1a; 其他转10 10转其他 2进制8和16 8和16转2 位运算&#xff1a; >> 除于2 <<乘以2 近似值 空心金字塔 this关键字还可以用于访问父类中的属性和方法

axios 二次封装 设置token

// 公有 axios.defaults.headers.common[Y-Auth-Token]eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c 设置后 并发起请求&#xff0c;你可以在浏览器控制台…

电脑提示“KBDRU1.DLL文件缺失”,导致游戏和软件无法启动运行,快速修复方法

看到很多小伙伴&#xff0c;在问电脑启动某些软件或游戏的时候&#xff0c;提示“KBDRU1.DLL文件缺失&#xff0c;软件无法启动&#xff0c;请尝试重新安装&#xff0c;解决问题”&#xff0c;不知道应该怎么办&#xff1f; 首先&#xff0c;我们要先了解“KBDRU1.DLL文件”是什…

数据结构学习 jz16 数值的整数次方

关键词&#xff1a;快速幂 位运算 之前已经学过快速幂了&#xff0c;所以只是回忆。快速幂有递归版和非递归版。 题目&#xff1a; 这道题和之前的快速幂的区别是 n可能为负数。分类讨论即可。 思路&#xff1a; 区分正负&#xff1a; if (n < 0) return POW(1.0 / x, …

ASUS华硕ROG幻14笔记本2023款G14 GA402XV原装出厂Win11系统

华硕幻14锐龙R9-7940HS笔记本电脑原厂Windows11.22H2系统 适用型号&#xff1a;GA402XU、GA402XV、GA402XI、GA402XY、GA402XZ 链接&#xff1a;https://pan.baidu.com/s/1sMva1u7D8uFoGnm2Hjrdug?pwdho91 提取码&#xff1a;ho91 原厂系统自带所有驱动、出厂主题壁纸、…

AWS EKS1.26+kubesphere3.4.1

1、前提准备 1台EC2服务器Amazon Linux2&#xff0c;设置admin的角色 安装 aws cli V2 ​ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"unzip awscliv2.zipsudo ./aws/installexport PATH/usr/local/bin:$PATHsou…

pod进阶版(2)

startupProbe启动探针 如果探测失败,pod的状态是notready&#xff0c;启动探针会重启容器 启动探针没有成功之前&#xff0c;后续的探针都不会执行。启动探针成功之后&#xff0c;在pod的后续生命周期不会用启动探针 exec方式 正确示范 apiVersion: v1 kind: Pod metadata…

【React系列】react-router

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 认识react-router 1.2. 前端路由原理 前端路由是如何做到URL和内容进行映射呢&#xff1f;监听URL的改变。 UR…

【优选算法】专题三:二分查找 --- 34. 在排序数组中查找元素的第一个和最后一个位置

从今天开始,xxxflower 带着小伙伴们一起学习算法 ~ 今天我们要写的题目是: 34. 在排序数组中查找元素的第一个和最后一个位置 以下是题目的详细解析: class Solution {public int[] searchRange(int[] nums, int target) {// 判断数组为空的情况下返回-1,-1int[] ret new in…

在centos上安装WordPress 及创建配置文件无反应的解决方案

一、安装Apache服务 1.直接在命令行中输入以下命令即可,顺便安装编译组件&#xff1a; yum install -y httpd yum install -y httpd-devel2.启动Apache服务和设置Apache自启&#xff1a; 1 systemctl start httpd 2 systemctl enable httpd 3.添加一个测试页面&#xff0c;…

4《数据结构》

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

Html5实用个人博客留言板模板源码

文章目录 1.设计来源1.1 主界面1.2 认识我界面1.3 我的日记界面1.4 我的文章列表界面和文章内容界面1.5 我的留言板界面 2.演示效果和结构及源码2.1 效果演示2.2 目录结构2.3 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151…