jvm是否加载了类路径提到的所有类?

hsi*_*ngh 9 java classloader

当我们使用-cp命令调用java命令时,我们提供了一些目录和jar文件.jvm是否加载了类路径提到的所有类或者它只是jvm在需要时会查找的所有类的超集?

Jun*_*san 10

jvm是否加载了类路径提到的所有类或者它只是jvm在需要时会查找的所有类的超集?

JVM根据需要从类路径加载类,即当为类找到引用时,它被加载.JVM中还有类加载器的层次结构,由较低类加载器使用由父类加载器加载的类.


Zho*_*gYu 5

涉及两个概念

  • 加载
  • 初始化

初始化一个类将初始化字段并执行静态块。发生这种情况的确切时刻对于应用程序语义很重要,因此它被精确定义

初始化需要先加载;但加载更多的是 JVM 的内部概念。即使不需要,JVM 也可以并且被允许积极地预加载类。此过程不影响应用程序语义,并且对应用程序不可见。

至于应用程序而言,类必须已如果我们得到一个装Class的是对象,例如从Foo.classClass.forName或其它反射的API。我们可以检查 的属性Class而不必触发初始化。

一个重要的约束 - 我们必须Class为相同的类名(并且来自相同的类加载器)获取相同的对象。该Class对象是已加载类表示。

  • @SotiriosDelimanolis - 一个不好的类加载器甚至可能返回错误的 Class 对象!我认为这句话的意思是“合法”的类加载器应该这样做。在 JLS 和 javadocs 中有很多提到“*the* Class object”,例如 `static synchronized` 对“the Class object”进行操作;如果一个类可以有 2 个 Class 对象,那就没有多大意义了。此外,`Class` 不会覆盖 `equals`,并且有很多代码直接使用 `==` 来检查 Class 相等性,即使在 JLS 中的示例中也是如此。 (2认同)