java反射源码_JAVA反射机制的源码改动

展开全部

先前我曾提到,原本想借由“改动e68a84e8a2ad3231313335323631343130323136353331333339666666Java标准库源码”来测知Class object的生成,但由于其ctor原始设计为private,也就是说不可能透过这个管道生成Class object(而是由class loader负责生成),因此“在ctor中打印出某种信息”的企图也就失去了意义。

这里我要谈点题外话:如何修改Java标准库源码并让它反应到我们的应用程序来。假设我想修改java.lang.Class,让它在某些情况下打印某种信息。首先必须找出标准源码!当你下载JDK 套件并安装妥当,你会发现jdk150\src\java\lang 目录(见图10)之中有Class.java,这就是我们此次行动的标准源码。备份后加以修改,编译获得Class.class。接下来准备将.class 搬移到jdk150\jre\lib\endorsed(见图10)。

这是一个十分特别的目录,class loader将优先从该处读取内含classes的.jar文件——成功的条件是.jar内的classes压缩路径必须和Java标准库的路径完全相同。为此,我们可以将刚才做出的Class.class先搬到一个为此目的而刻意做出来的\java\lang目录中,压缩为foo.zip(任意命名,唯需夹带路径java\lang),再将这个foo.zip搬到jdk150\jre\lib\endorsed并改名为foo.jar。此后你的应用程序便会优先用上这里的java.lang.Class。整个过程可写成一个批处理文件(batch file),如图11,在DOS Box中使用。

图10:JDK1.5 安装后的目录组织。其中的endorsed 是我新建。

del e:\java\lang\*.class //清理干净

del c:\jdk150\jre\lib\endorsed\foo.jar //清理干净

c:

cd c:\jdk150\src\java\lang

javac -Xlint:unchecked Class.java //编译源码

javac -Xlint:unchecked ClassLoader.java //编译另一个源码(如有必要)

move *.class e:\java\lang //搬移至刻意制造的目录中

e:

cd e:\java\lang //以下压缩至适当目录

pkzipc -add -path=root c:\jdk150\jre\lib\endorsed\foo.jar *.class

cd e:\test //进入测试目录

javac -Xlint:unchecked Test.java //编译测试程序

java Test //执行测试程序

图11:一个可在DOS Box中使用的批处理文件(batch file),用以自动化java.lang.Class

的修改动作。Pkzipc(.exe)是个命令列压缩工具,add和path都是其命令。

343cef66d65fac88d1f4258bed9d30de.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值