候捷谈Java反射机制(6)

Java 源码改动办法<o:p></o:p>

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

<o:p> </o:p>

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

<o:p> </o:p>

这是一个十分特别的目录,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中使用。<o:p></o:p>

<o:p> 图10</o:p>

<o:p></o:p>

10JDK1.5 安装后的目录组织。其中的endorsed 是我新建。<o:p></o:p>

<o:p> </o:p>

del e:\java\lang\*.class //清理干净<o:p></o:p>

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

c:<o:p></o:p>

cd c:\jdk150\src\java\lang<o:p></o:p>

javac -Xlint:unchecked Class.java //编译源码<o:p></o:p>

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

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

e:<o:p></o:p>

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

pkzipc -add -path=root c:\jdk150\jre\lib\endorsed\foo.jar *.class<o:p></o:p>

cd e:\test //进入测试目录<o:p></o:p>

javac -Xlint:unchecked Test.java //编译测试程序<o:p></o:p>

java Test //执行测试程序<o:p></o:p>

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

的修改动作。Pkzipc(.exe)是个命令列压缩工具,addpath都是其命令。<o:p></o:p>

<o:p> </o:p>

更多信息<o:p></o:p>

以下是视野所及与本文主题相关的更多讨论。这些信息可以弥补因文章篇幅限制而带来的不足,或带给您更多视野。<o:p></o:p>

<o:p> </o:p>

l         "Take an in-depth look at the Java Reflection API -- Learn about the new Java 1.1 tools forfinding out information about classes", by Chuck McManis。此篇文章所附程序代码是本文示例程序的主要依据(本文示例程序示范了更多Reflection APIs,并采用JDK1.5 新式的for-loop 写法)。<o:p></o:p>

l         "Take a look inside Java classes -- Learn to deduce properties of a Java class from inside aJava program", by Chuck McManis<o:p></o:p>

l         "The basics of Java class loaders -- The fundamentals of this key component of the Javaarchitecture", by Chuck McManis<o:p></o:p>

l         The Java Tutorial Continued, Sun microsystems. Lesson58-61, "Reflection".<o:p></o:p>

<o:p> </o:p>

1用过诸如MFC这类所谓 Application Framework的程序员也许知道,MFC有所谓的dynamic creation。但它并不等同于Java的动态加载或动态辨识;所有能够在MFC程序中起作用的classes,都必须先在编译期被编译器“看见”。<o:p></o:p>

<o:p> </o:p>

2如果操作对象是ObjectClass.getSuperClass()会返回null
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值