为什么我们不在filename.class
命令之后提供java
文件,而不仅仅是filename
?
假设我们要编译test.java
程序,然后运行javac test.java
。没关系!
之后它会生成test.class
个文件,但要运行该程序,我们会运行java test
而不是java test.class
。这是什么原因?
答案 0 :(得分:20)
因为您没有描述要运行的文件。您告诉Java哪个类包含main方法 - 类名称(在您的情况下)是filename
,而不是filename.class
。
字节码几乎总是包含在文件系统的文件中这一事实是一个实现细节。传递给java
命令的类路径告诉它 where 查找类,然后main类参数告诉它使用哪个类。
(javac
不同,因为此程序专门采用源文件并将它们编译为字节码。)
答案 1 :(得分:6)
您也不会将文件名传递给java命令。您传递一个完全限定的类名。像com.yourcompany.yourapp.Main
这样的东西。然后,Java通过查看类路径中的所有目录和jar文件,找到此类名的.class文件。
答案 2 :(得分:1)
这是一个实现细节。 Java类加载器系统可以通过自定义代码进行扩展,以使其行为不同。例如,一些公司已经编写了加密的类加载器,它们能够动态地解密和加载加密的类文件。你可以假设创建一个类似的系统,将一堆类组合成一个类似.NET程序集的东西,而不是Jar文件(实际上只是一个zip文件)。
答案 3 :(得分:0)
执行" java test.class
"
你得到
无法找到或加载主类test.class
或
线程中的异常" main" java.lang.NoClassDefFoundError:test / class
这是因为" java
" in" java test.class
"是jvm
。它在类中寻找主要方法" class
"而不是" test
"。点'" java test.class
"具有重要意义。那么jvm
在一个名为" java test.class
"的软件包中如何查看" test
"它查找名为" class
"。
*test.class*
*test* - package name
*class* - java filename
希望这会有所帮助!!
答案 4 :(得分:0)
只是对所有细节进行总结,
什么时候做
java filename.java
实际上,他运行Java编译器并将代码转换为JVM可以理解的指令。
现在一个人跑步
javac main_file
/ s调用JVM来运行整个项目,该项目的主要方法在类 main_file 中
此 main_file 实际上是该类的完全限定名称,即,如果我有一个ProjectX,并且该主类位于 src.java.hello.main 包中,
您应该运行命令
java src.java.hello.main.main_file
因此,.
实际上是在JVM端保留的东西,我们不能将.class
作为 java 命令的参数的一部分。
答案 5 :(得分:-1)
Javac编译器创建名为Xyz.class的文件(这里Xyz是FileName) 包含程序的字节版本 Java Bytecode只是程序的中间表示,包含Java解释器将执行的指令 因此,javac的输出不是可以直接执行的代码
简而言之,javac关键字用于编译Java程序 如果我们使用.class与javac(已经编译的文件.class文件)然后如何编译已经编译文件
所以有效语法是: Javac Xyz.java(编译Java程序) java Xyz(运行Java程序)