这里我要谈点题外话(第2/2页)该书审核已经通过fxl

重要通知:域名变更为m.bxuu.net请收藏

Methodobject。接下来准备一个Object[]放置自变量,然后调用上述所得之特定Methodobject的invoke(),如图8。知道为什么索取Methodobject时不需指定回返类型吗?因为thodoverloading机制要求signature(署名式)必须唯一,而回返类型并非signature的一个成份。换句话说,只要指定了thod名称和参数列,就一定指出了一个独一无二的thod。先前我曾提到,原本想借由“改动Java标准库源码”来测知Classobject的生成,但由于其ctor原始设计为private,也就是说不可能透过这个管道生成Classobject(而是由classloader负责生成),因此“在ctor中打印出某种信息”的企图也就失去了意义。

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

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