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> </o:p>
<o:p></o:p>
图10:JDK1.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)是个命令列压缩工具,add和path都是其命令。<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如果操作对象是Object,Class.getSuperClass()会返回null。
相关推荐
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...
7. **反射机制**:深入理解Java反射的概念,如何在运行时动态访问类、接口、方法和构造器。 8. **设计模式**:讲解常用的设计模式,如单例、工厂、观察者、装饰者、代理等,以及如何在实际开发中应用。 9. **JVM...
这篇《候捷谈Java反射机制》的文章应该深入探讨了这一主题。 反射的核心概念主要包括Class类、Constructor类、Method类和Field类。以下是对这些关键知识点的详细说明: 1. **Class类**:在Java中,每个类都有一个...
- **异常处理**:详细讲解Java中的异常处理机制,包括异常的抛出、捕获及处理策略,帮助开发者编写健壮的应用程序。 - **泛型与集合框架**:重点介绍了Java泛型的概念及其在集合框架中的应用,使开发者能够写出类型...
7. **反射机制**:利用反射动态获取类的信息,创建对象,调用方法,修改字段值,了解Class类和Method类的使用。 8. **设计模式**:常见的设计模式如工厂模式、单例模式、观察者模式、装饰者模式等,理解其应用场景...
8. **反射与动态代理**:Java的反射机制能让我们在运行时检查类的信息并操作对象,动态代理则能在运行时创建具有特定接口的代理类,这对于AOP(面向切面编程)和插件式系统很有用。 9. **Java EE基础**:虽然不是...
2. **Java技术**:精通Java核心技术,包括反射、集合、网络编程和IO流的使用。 3. **Web应用开发**:熟练运用jsp、servlet、JSTL/EL、dom4j和JDBC,具备Struts2、Spring、Hibernate等主流框架的实践经验。 4. **...