我了解到here,即使这是最佳做法,尽管大多数编译器都要求您这样做,但在它们包含的公共类之后命名的.class
文件并不严格,至少从语言规范的角度来看。
我搜索了JLS和JVM规范,但无法找到解决该主题的实际章节。对我来说这个问题根本没有被处理似乎很奇怪。
如果存在,Oracle官方文档可以确认或揭穿以下声明吗?
为
.class
文件提供与它们包含的公共类相同的名称 - 无论它们是否 - 只是必须的,但根据JLS,这并不严格。从JLS的角度来看,编译器可以选择是否设置这样的限制。
答案 0 :(得分:2)
JLS §13.1., The Form of a Binary:
解决了这个问题程序必须编译为 Java虚拟机规范,Java SE 8版指定的
class
文件格式,或者编译成可以通过a映射到该格式的表示形式用Java编程语言编写的类加载器。
因此,只要您有一个能够加载代码表示的类加载器实现,就不需要将编译后的代码作为.class
文件提供。请注意,在此级别上,例如将映射数据传递给ClassLoader.defineClass
时,类文件的文件名根本不存在。规范JLS和JVM一直使用术语“类文件”同义词来表示“类文件格式中的字节序列”,而不是“文件系统或zip存档中的条目”,因此,永远不要提及文件名。所有
这也符合Java 9的发展方向,提供类库是一种自定义的,可能优化的库格式,而不是一个装满.class
文件的zip容器。
但是,我们非常不鼓励将包含不同表示的文件命名为.class
个结尾。
你引用的陈述有点奇怪。它以
开头为
.class
个文件提供与其包含的公共类名相同的文件,这是必须的,......
但.class
文件根本不必包含public
类。在目前的形式中,它最多包含一个不必是public
的类。但它也可能包含一个虚拟类来传递package
元信息,或者从Java 9开始,提供模块规范。
此外,为了在默认查找规则中找到,例如,使用URLClassLoader
,您没有给.class
文件包含所包含类的名称,而是使用其短名称并将其放在从其限定名称的包组件派生的目录结构/路径中
但第二部分
......但根据JLS,这并不严格。从JLS的角度来看,编译器可以选择是否设置这样的限制。
是对的。如上所述,甚至不需要传递类文件。与
比较 JLS §1., Introduction:Java编程语言通常编译为 Java虚拟机规范,Java SE 8 Edition 中定义的字节码指令集和二进制格式。
注意“通常”
这个词和
JVMS §2.1., The class File Format:由Java虚拟机执行的编译代码使用独立于硬件和操作系统的二进制格式表示,通常(但不一定)存储在文件中,称为
class
文件格式。 / p>
“通常(但不一定)”......