【发布时间】:2017-10-18 13:11:15
【问题描述】:
我了解到here,即使这是最佳实践,尽管大多数编译器都要求您这样做,但将 .class 文件以它们包含的公共类命名并不那么严格,至少来自语言规范观点。
我搜索了 JLS 和 JVM 规范,但无法找到解决该主题的实际章节。我觉得这个问题根本没有得到处理,这让我觉得很奇怪。
如果存在,Oracle 官方文档在哪里可以确认或揭穿以下声明?
给
.class文件赋予与它们包含的公共类相同的名称——不管它们是否这样做——是必须的,但根据JLS,这并不那么严格。从 JLS 的角度来看,由编译器决定是否设置这样的限制。
【问题讨论】:
-
我会使用章节或页码在出版物/著作中进一步引用该主题。
-
请注意,每个 .java 源可能有多个 .class 文件,即每个创建的内部类都有一个。对于命名内部类,它们通常具有
[toplevel_public_class]$[inner_class].class格式,对于匿名内部类,它们通常具有[toplevel_public_class]$[number].class格式。我不知道这是一个规则还是只是一些标准的做法,但这是一个例子,.class 文件并不总是与顶级类的名称完全匹配(尽管它是名称的重要部分)。 -
顺便说一句,我在这里可能错了,但从运行时的角度来看,文件名根本不重要,因为文件包含所有必要的信息。但是,具有匹配的文件名使人类或基于文本的操作更容易(例如,尝试在 jar 中查找类以加载它),因为您不必扫描每个文件以找到正确的文件。对源文件的限制可能也主要是为了防止人类把它搞砸;)
-
如果你要确认,事实上,
.class文件没有严格要求以它们包含的公共类命名:你的生活将如何改善?如果你知道这样的需求确实存在,它真的那么糟糕吗? -
@Thomas 正如您所说,Java 链接器需要知道它必须加载哪个 .class 文件,并且在大型项目中找到正确的文件需要很长时间。但奇怪的是,即使所有主要编译器和 Oracle NetBeans IDE 都遵循此规则,JLS 也从未解决此问题。
标签: java jvm documentation jls