3

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

VM-spec包含类文件格式的详细规范,但似乎没有关于它们应该如何命名以及它们应该存储在哪里的规范。同样,语言规范似乎也没有涉及这个主题。

4

2 回答 2

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.

提到的文件: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,后跟$,后跟类型变量的简单名称。

所以可以说,众所周知的命名方案完美规范的,我们可以依赖它(因为必须依赖所有的类加载器来找到必要的类文件)。

于 2012-08-23T08:06:30.930 回答
0

我相信命名方案没有在正式意义上指定,因为它(据说)是一个实现细节。

于 2012-08-23T07:57:49.350 回答