java - java.exe如何执行java源代码?

标签 java jvm java-11

当我的目录中只有 HelloWorld.java 而没有 HelloWorld.class 时,Windows cmd 中的 java HelloWorld 引发了类未找到异常。但是,java HelloWorld.java 已正确执行,无需生成 HelloWorld.class

据我了解,JVM读取扩展名为.class的文件的字节码,但无法读取.java文件。我知道 java.exe 只是一个创建 JVM 并运行它的启动器,但现在我很困惑它如何与 java 代码而不是字节代码正常工作。

最佳答案

tl;博士

在现代 Java 中,为了方便 Java 初学者,java 应用程序将优雅地编译并运行 .java 文件。

将其视为 java 应用程序检测源代码文件,然后将编译工作分包给 javac 应用程序,将编译后的类缓存在内存中,然后最后继续运行新编译的类。

详细信息

一个JDK捆绑有 few dozen tools 。其中有几个至关重要:

  • javac — 将源代码文本的 .java 文件编译为字节码的 .class 文件。
  • java — 通过启动 JVM 来执行该 .class 文件.

流程步骤是:

  1. 您在 .java 文件中编写 Java 源代码,其中包括 class 定义中的 main 方法。
  2. 您将该文件提交给编译器,例如与每个 JDK 捆绑在一起的 javac 应用程序.
  3. 编译器输出一个 .class 文件。
  4. 您可以通过启动与每个 JDK 捆绑在一起的 java 应用程序来执行(运行)main 方法。

您可以跳过一些步骤。

  • 编译运行单个文件:
    从 Java 11 开始,您可以将 java 应用程序指向 .java 文件。 java 应用程序将首先自动编译,就像 javac 被代表您调用一样。然后java应用程序将继续运行新编译的类。
    • 没有 .class 文件写入存储。编译后的类缓存在内存中。
    • 参见JEP 330: Launch Single-File Source-Code Programs了解所有详细信息。
    • 您注意到了这种行为:但是,java HelloWorld.java 已正确执行,而没有生成 HelloWorld.class。
  • 简化的main
    作为 Java 21 中的预览功能,您可以:

动机

Java 团队正在共同努力,为初级 Java 程序员提供便利,以消除最初的障碍。他们试图掩盖一些复杂的仪式,并使工具更加友好和包容。

Java 的底层结构和特性仍然存在。这并不是 Java 的“简化”。这些努力只是为初学者提供合理便利的尝试。

Hello World

结合这些功能,开始使用 Hello World 应用程序非常简单,只需在 HelloWorld.java 文件中编写以下内容即可:

void main() {
    System.out.println("Hello, World!");
}

…然后在命令行上调用:

java HelloWorld.java

控制台结果:

Hello, World!

对于 Java 新手来说,这大大减少了工作量并减少了困惑。


jshell

顺便说一句...另一个使 Java 更易于使用的部分是 jshell ,一个REPL对于 Java。

初学者和专业人士都发现 jshell 可以方便地运行简短的 Java 代码并提供即时反馈。

BlueJ

另一个对初学者有用的工具是 BlueJ ,一个IDE专为学生设计。

关于java - java.exe如何执行java源代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77114812/

相关文章:

java - 在 strings.xml 中本地化字符串会产生 NullPointerException

java - 如何做 iPOJO 实例化

java - 在 JAVA 中打印 3D 数组时出现 ArrayIndexOutOfBoundsException

scala - 改进 Scala 的 JVM

Java 11 : Patch sun. misc.BASE64Encoder

java - 循环遍历 JPanel 中的嵌套字段

java - 我应该在这个系统上为 Eclipse 使用什么内存设置?

java - java.lang.Class 方法线程安全吗?

java - OpenJDK 发行说明 : does not include jar specification?

启用 Spring AOP [JAVA 11] 后,Spring 数据存储库无法正常工作