Java对其结构化的源文件有一些严格的规则,例如,在具有相同名称的文件中每个文件只需要一个类。
javac在Bytecode .class
文件中编译每个源文件。
我的问题是,其他语言存在编译到Java字节码并且没有像Java(Scala,某些版本的Ruby)那样严格的结构,即使源代码不是,也需要在类文件层次结构中生成字节码文件?
更新 我不是在谈论JVM的方法,我在谈论字节码文件是否必须遵循Java源文件的结构(每个文件一个类)或者它是否开放到其他结构。文件规范没有说明任何内容。
答案 0 :(得分:1)
字节码文件只包含一个类。这是由JVM规范规定的。如果要在单个文件中保留许多类,标准解决方案是将它们打包在.jar文件中,该文件实际上是.zip文件。
相反,Java源文件可能包含多个类。但是,源文件中最多只能有一个公共顶级类。
答案 1 :(得分:0)
不确定您指的是哪个规范,但是来自Oracle的规范使得非常明确表明每个类文件中都有一个类(除此之外:为什么你认为它们被称为类文件。)
引自here:
一个类文件由单个 ClassFile结构组成:
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
所以,非常明显:每个类文件一个这样的结构;并且恰好有一个类由这样的结构表示。
只是为了记录:如果你真的打算在一个应该创建有效字节码文件的编译器上工作......那么你需要更加勤奋。这种工作有点高级;你已经在第一步磕磕绊绊了。
答案 2 :(得分:-3)
如果是Java字节码,它的排序方式是任何JVM(Java虚拟机)都可以理解它。
如果遵守标准的任何JVM都无法运行您的Java字节码,那么它就不是Java字节码。
JVM有多种形式(Sun / Oracle,IBM,Google等),但如果他们可以在所有平台上运行所有Java代码,那么它们只是真正的Java。答案是否定的。如果Java规范不允许,那么也不应该使用JVM。