.class-files的名称和位置在哪里定义?

Bjö*_*lex 3 java specifications .class-file

这个问题最受欢迎的答案建议在特定文件夹中搜索具有特定名称的类文件,作为反映匿名内部类的解决方法.在哪个文档(如果有)中指定了Java类文件的名称和位置?

VM-规范包含的类文件的格式的详细规范,但似乎没有他们的命名方式以及它们应存放规范.同样,语言规范似乎没有触及这个主题.

Den*_*ret 5

Class类的源代码(getSimpleName方法):

 1137           // According to JLS3 "Binary Compatibility" (13.1) the binary
 1138           // name of non-package classes (not top level) is the binary
 1139           // name of the immediately enclosing class followed by a '$' followed by:
 1140           // (for nested and inner classes): the simple name.
 1141           // (for local classes): 1 or more digits followed by the simple name.
 1142           // (for anonymous classes): 1 or more digits.
Run Code Online (Sandbox Code Playgroud)

上面提到的文档:JLS3"二进制兼容性"(13.1)表明它是这样的(更精确但不简洁):

此外,生成的类文件必须具有某些属性.专门选择了许多这些属性来支持保持二进制兼容性的源代码转换.所需的属性是:

类或接口必须以其二进制名称命名,该名称必须满足以下约束:

顶级类型(第7.6节)的二进制名称是其规范名称(第6.7节).

成员类型的二进制名称(第8.5节,第9.5节)由其直接封闭类型的二进制名称组成,后跟$,后跟成员的简单名称.

本地类的二进制名称(第14.3节)由其直接封闭类型的二进制名称组成,后跟$,后跟非空数字序列,后跟本地类的简单名称.

匿名类的二进制名称(第15.9.5节)由其直接封闭类型的二进制名称组成,后跟$,后跟非空数字序列.

由泛型类或接口(第8.1.2节,第9.1.2节)声明的类型变量的二进制名称是其直接封闭类型的二进制名称,后跟$,后跟类型变量的简单名称.

泛型方法(第8.4.4节)声明的类型变量的二进制名称是声明方法的类型的二进制名称,后跟$,后跟Java™虚拟机规范中定义的方法描述符, Java SE 7 Edition,后跟$,后跟类型变量的简单名称.

由泛型构造函数(第8.8.4节)声明的类型变量的二进制名称是声明构造函数的类型的二进制名称,后跟$,后跟在Java™虚拟机规范中定义的构造函数的描述符, Java SE 7 Edition,后跟$,后跟类型变量的简单名称.

因此,可以说通常已知的命名方案完全规范化的,我们可以依赖它(因为必须依赖所有类加载器来查找必要的类文件).