由于没有人可以给出明确答案,也没有链接到文档的相应部分,我自己提供了一个答案。不过,我想感谢所有试图回答这个问题的人。
简答:
JVM启动时,类路径不是最终的。
您实际上可以在JVM启动后将类放在类路径中,并且它们将被加载。
长答案:
为了回答这个问题,我在user unknowns建议之后,写了一个小测试程序。
基本思想是要有两个类。一个是实例化第二类的主要类。在启动时,第二个类不在类路径上。 cli程序启动后,将提示您按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");
}
}
MyClass.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键。你会看到一个异常告诉你没有找到任何课程。
>现在再次启动程序。
>程序启动后,系统提示您按Enter键将MyClass文件复制到jvmtest文件夹中。
>按回车。你应该看到“MyClass v1”。
补充笔记:
当我将MyClass类打包在一个jar中并运行上面的测试时,这也是有效的。
我在Macbook Pro上运行Mac OS X 10.6.3
> 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)