修改Java标准库源码

摘要:
这里我要谈点题外话:如何修改Java标准库源码并让它反应到我们的应用程序来。假设我想修改java.lang.Class,让它在某些情况下打印某种信息。当你下载JDK套件并安装妥当,你会发现jdk150srcjavalang目录之中有Class.java,这就是我们此次行动的标准源码。
以下是摘抄,实际操作没有测试
先前我曾提到,原本想借由“改动Java标准库源码”来测知Class object的生成,但由于其ctor原始设计为private,也就是说不可能透过这个管道生成Class object(而是由class loader负责生成),因此“在ctor中打印出某种信息”的企图也就失去了意义。
这里我要谈点题外话:如何修改Java标准库源码并让它反应到我们的应用程序来。假设我想修改java.lang.Class,让它在某些情况下打印某种信息。首先必须找出标准源码!当你下载JDK 套件并安装妥当,你会发现jdk150srcjavalang 目录(见图10)之中有Class.java,这就是我们此次行动的标准源码。备份后加以修改,编译获得Class.class。接下来准备将.class 搬移到jdk150jrelibendorsed(见图10)。
这是一个十分特别的目录,class loader将优先从该处读取内含classes的.jar文件——成功的条件是.jar内的classes压缩路径必须和Java标准库的路径完全相同。为此,我们可以将刚才做出的Class.class先搬到一个为此目的而刻意做出来的javalang目录中,压缩为foo.zip(任意命名,唯需夹带路径javalang),再将这个foo.zip搬到jdk150jrelibendorsed并改名为foo.jar。此后你的应用程序便会优先用上这里的java.lang.Class。整个过程可写成一个批处理文件(batch file),如图11,在DOS Box中使用。
图10:JDK1.5 安装后的目录组织。其中的endorsed 是我新建。
del e:javalang*.class //清理干净
del c:jdk150jrelibendorsedfoo.jar //清理干净
c:
cd c:jdk150srcjavalang
javac -Xlint:unchecked Class.java //编译源码
javac -Xlint:unchecked ClassLoader.java //编译另一个源码(如有必要)
move *.class e:javalang //搬移至刻意制造的目录中
e:
cd e:javalang //以下压缩至适当目录
pkzipc -add -path=root c:jdk150jrelibendorsedfoo.jar *.class
cd e: est //进入测试目录
javac -Xlint:unchecked Test.java //编译测试程序
java Test //执行测试程序
图11:一个可在DOS Box中使用的批处理文件(batch file),用以自动化java.lang.Class
的修改动作。Pkzipc(.exe)是个命令列压缩工具,add和path都是其命令。

免责声明:文章转载自《修改Java标准库源码》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【java】集合操作中的retainAll的坑WPF 自定义滚动条样式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

web框架前言与学生数据库系统(附1.0源码)

  对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。 import socket def f1(request): """ 处理用户请求,并返回相应的内容 :param request: 用户请求的所有信息 :return: """...

AI Accord.NET入门

Accord.NET官网:http://accord-framework.net/index.html Accord.NET的Github页面:https://github.com/accord-net/framework 入门用到的资料全部来源以上两个链接,源码可以在Github上下载,介绍Accord.NET的可以在官网上看看,总之Accord.NE...

【spring】spring源码阅读之xml读取、bean注入(BeanFactory)

前言   此源码其实是在4月中旬就看了,而且当初也写了一份word文档,但不打算直接把word发上来。还是跟着以前的笔记、跟踪代码边看边写吧。   其实当初看源码的理由很简单,1、才进新公司,比较有空闲。2、面试老是问spring的问题,我理论又不好,所以想看下。   但现在,我重新看的目的其实不在于其实现原理,而是想学习和写出好的编码风格。(当初大概花了...

在Ubuntu-14.04.3配置并成功编译Android6_r1源码

在Ubuntu-14.04.3配置并成功编译Android6_r1源码 折腾了一周,终于把Android6_r1的源码编译成功。先上图,这是在ubuntu中运行的Android模拟器: 由于我是在win8中安装虚拟机VMware,然后在虚拟机中安装Ubuntu进行编译,所以遇到诸多麻烦。如果直接在linux中编译,可能会更顺利。 -----------...

《老罗Android开发视频教程》老罗来交国庆的答卷了

     之前在博客园、开源中国、安卓巴士发表的《老罗将死,或者Android也将就换代,但是互联网的,共享,互助精神将永存》,计划出300集免费的、高质量的、全面的Android开发视频教程,得到了很多人的支持,但是同样也遭到了一些人的质疑,说老罗是空有一翻热情,肯定会半途而废的,因此老罗决定在隔一段时间就在博客园里面给大家交个答卷,也让这些人看...

源码剖析——深入Windows句柄本质

参考资料: 1. http://www.codeforge.cn/read/146318/WinDef.h__html windef.h头文件 2. http://www.codeforge.cn/read/146318/WinNT.h__html winnt.h头文件 3. https://msdn.microsoft.com/en-us/library...