当前位置: 首页 > 面试题库 >

Java类路径在JVM启动之后是最终的吗?

鄢选
2023-03-14
问题内容

最近,我阅读了很多有关Java类加载过程的信息。我经常碰到一些文字,这些文字声称在运行时无法将类添加到类路径并在没有类加载器黑客(URLClassLoaders等)的情况下加载它们

据我所知,类是动态加载的。这意味着仅在需要时才将其字节码表示形式加载并转换为java.lang.Class对象

因此,如果尚未启动JVM,是否应该在JVM启动后将JAR或
.class文件添加到类路径并加载这些类?(要清楚:在这种情况下,类路径只是文件系统上的文件夹。“添加JAR或

.class文件”只是意味着将它们放在此文件夹中。)

如果不是,这是否意味着在JVM启动时搜索类路径,并且所找到类的所有全限定名称都缓存在内部“列表”中?

如果您能在回答中为我提供一些参考资料,对您会很好。最好是正式的SUN文档:Sun JVM
Spec。我已经阅读了规范,但是找不到关于类路径的任何信息,并且如果它在JVM启动时完成了确定。

聚苯乙烯

这是一个理论问题。我只想知道是否有可能。我没有想要实现的实用方法。我只是渴求知识:)


问题答案:

由于没有人可以给我一个明确的答案,也没有人提供与文档相应部分的链接,因此我自己提供一个答案。不过,我要感谢所有试图回答这个问题的人。

简短答案:

在JVM启动时,类路径不是最终的。

实际上,您可以在JVM启动后将类放在类路径中,然后将它们装入。

长答案:

为了回答这个问题,我遵循了用户未知的建议,并编写了一些测试程序。

基本思想是有两个类。第一类是实例化第二类的主要类。启动时,第二个类不在类路径中。cli程序启动后,将提示您按Enter。在按Enter之前,您将第二个类复制到类路径上。按Enter后,将实例化第二个类。如果类路径在JVM启动时是最终的,则将引发Exception。但事实并非如此。因此,我认为classpath在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文件夹。您显然必须根据放置课程的位置对此进行更改。

所以这是我执行的步骤:

  1. 确保jvmtest中只有JVMTest.class。
  2. 从上方使用命令启动程序。
  3. 只是要确保按回车键。您应该看到一个异常,告诉您找不到任何类。
  4. 现在再次启动程序。
  5. 程序启动后,提示您按Enter,将MyClass文件复制到jvmtest文件夹中。
  6. 按回车。您应该看到“ MyClass v1”。

补充笔记:

当我将MyClass类包装在罐子中并运行上面的测试时,这也起作用。

我在运行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)


 类似资料:
  • 我想检查一个链接的href是否是网站路径之后的文件。代码如下: 有没有办法让它检查在“http://127.0.0.1:5500”后面是“/”还是“/index.html”?谢谢你!

  • 问题内容: 在Java 7的try-with-resources中,我不知道finally块和自动关闭发生的顺序。什么顺序 问题答案: 资源在捕获或最终阻塞之前被关闭。请参阅本教程。 try-with-resources语句可以具有catch并最终阻塞,就像普通的try语句一样。在try-with- resources语句中,在声明的资源已关闭之后,将运行任何catch或finally块。 要评估

  • 问题内容: 我做了以下步骤,但是java似乎对我不起作用,如果需要,我是否需要重新启动系统,为什么? 我在cmd中运行Java时遇到以下错误 问题答案: 否,但是您将需要关闭并重新创建任何窗口,运行Java程序等。 要检查它是否正确,请打开一个新窗口,然后键入->查看有关和的信息。

  • 问题内容: 这是我之前的问题的后续内容,我对此感到有些尴尬。但是无论如何:您将如何以独立于系统的方式从独立的Java程序中启动第二个JVM?而且,例如,在不依赖于诸如JAVA_HOME之类的env变量的情况下,它可能会指向与当前正在运行的JRE不同的JRE。我想出了以下代码,该代码实际上有效,但感觉有点尴尬: 另外,当前正在运行的JVM可能已使用第二个JVM不知道的其他一些参数(-D,-X …,…

  • 问题内容: 我正在寻找Eclipse存储其启动配置的文件。我正在Ubuntu中进行一些Java开发。 我正在开发的一个可执行文件需要另一个可执行文件的输出作为其参数。可以这么说,“ B”的输出需要作为命令行参数传递给“ A”。在Eclipse中,我不想每次都手动更改“运行配置”。Eclipse将这些配置(尤其是参数)存储在哪里? 我在项目的extras文件夹中找到了“ eclipseArgumen

  • 我正在开发一个java应用程序,它使用gradle和launch4j插件创建一个windows exe包装器。我需要编写一个“help”框架,以便在应用程序中向用户显示帮助文档,鉴于类路径中的唯一项是lib文件夹中的各种jar文件,我不确定有什么方法可以做到这一点。 我计划为帮助文件制作HTML文档,并通过JavaFX WebView控件将这些文档加载到GUI中。考虑到这一点,我在应用程序发行版中