由于没有人能给我一个明确的答案,也没有一个指向文档相应部分的链接,我自己提供了一个答案。尽管如此,我要感谢所有试图回答这个问题的人。
简短的回答:
类路径在 JVM 启动时不是最终的。
实际上,您可以在 JVM 启动后将类放在类路径中,它们将被加载。
长答案:
为了回答这个问题,我遵循了用户未知数的建议,并编写了一个小测试程序。
基本思想是有两个类。一个是实例化第二个类的主类。启动时,第二个类不在类路径上。cli 程序启动后,它会提示您按 Enter 键。在按 Enter 键之前,请复制类路径上的第二个类。按回车键后,将实例化第二个类。如果类路径在 JVM 启动时是最终的,这将引发异常。但事实并非如此。因此,我假设类路径在 JVM 启动时不是最终的。
以下是源代码:
JVMTest.java
package jvmtest;
import java.io.Console;
import jvmtest.MyClass;
public class JVMTest {
public static void main(String[] args) {
System.out.println("JVMTest started ...");
Console c = System.console();
String enter = c.readLine("Press Enter to proceed");
MyClass myClass = new MyClass();
System.out.println("Bye Bye");
}
}
我的班级.java
package jvmtest;
public class MyClass {
public MyClass() {
System.out.println("MyClass v2");
}
}
文件夹结构如下所示:
jvmtest/
JVMTest.class
MyClass.class
我用这个命令启动了cli程序:
> java -cp /tmp/ jvmtest.JVMTest
如您所见,我在 /tmp/jvmtest 中有我的 jvmtest 文件夹。显然,您必须根据放置类的位置进行更改。
因此,以下是我执行的步骤:
- 确保只有 JVMTest.class 在 jvmtest 中。
- 使用上面的命令启动程序。
- 只是为了确保按回车键。您应该会看到一个异常,告诉您找不到任何类。
- 现在再次启动程序。
- 程序启动后,系统会提示您按 Enter 将 MyClass 文件复制到 jvmtest 文件夹中。
- 按回车键。您应该看到“MyClass v1”。
附加说明:
当我将MyClass类打包在jar中并运行上面的测试时,这也有效。
我在运行Mac OS X 10.6.3的Macbook Pro上运行了这个
> Java -version
结果:
java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02-279-10M3065)
Java HotSpot(TM) 64-Bit Server VM (build 16.3-b01-279, mixed mode)