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

wkyowqbh  于 8个月前  发布在  Java
关注(0)|答案(3)|浏览(84)

当目录中只有HelloWorld.java而没有HelloWorld.class时,Windows cmd中的java HelloWorld引发了一个class not found异常。但是,java HelloWorld.java在没有生成HelloWorld.class的情况下被正确执行。
据我所知,JVM读取扩展名为.class的文件的字节码,但无法读取.java文件。我知道java.exe只是一个创建JVM并运行它的启动器,但现在我很困惑它如何与Java代码一起正常工作,而不是字节码。

5lwkijsr

5lwkijsr1#

tl;dr

在现代Java中,为了方便初学Java的学生,java 应用程序将优雅地编译,然后运行.java文件。
把它想象成 java app检测一个源代码文件,然后把编译工作分包给 javac app,把编译后的类缓存在内存中,最后继续运行新编译的类。

详情

JDKfew dozen tools捆绑在一起。其中有几个是至关重要的:

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

工艺步骤为:
1.您可以在.java文件中编写Java源代码,包括class定义中的main方法。
1.您可以将该文件提交给编译器,例如与每个JDK捆绑的 javac 应用程序。
1.编译器输出一个.class文件。
1.您可以通过启动与每个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

控制台上的结果:
你好,世界!
对于一个Java的新学生来说,这是一个巨大的劳动力和混乱的减少。

jshell

顺便说一下..另一个让Java更容易使用的东西是jshell,一个Java的REPL
初学者和专业人士都发现 jshell 可以方便地运行简短的Java代码,并提供即时反馈。

BlueJ

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

oug3syen

oug3syen2#

JEP-330中所述,对于您的示例,

java HelloWorld.java

非正式地等同于

javac -d <memory> HelloWorld.java
java -cp <memory> hello.World
piah890a

piah890a3#

自Java 9以来,我们有jshell作为Java语言的REPL工具(REPL与Python相同),Java代码源的交互式解释器。
从Java 11开始,您可以在java命令的帮助下执行JVM字节码或解释Java源代码(源文件模式)(参见https://openjdk.org/jeps/330)。该文件的摘录如下:
从JDK 10开始,java启动器以三种模式运行:启动一个类文件,启动一个类文件的主类,或者启动一个模块的主类。在这里我们添加了一个新的第四种模式:启动在源文件中声明的类
口译员是如何工作的?这(几乎)是没有兴趣的,但极有可能是在引擎盖下进行的一些编译步骤。

相关问题