this question最受欢迎的答案建议在特定文件夹中搜索具有特定名称的类文件,作为反映匿名内部类的解决方法。在哪个文档(如果有)中指定了Java类文件的名称和位置?
VM-spec包含类文件格式的详细规范,但似乎没有说明它们应该如何命名以及它们应该存储在何处。同样,language-spec似乎没有触及此主题。
答案 0 :(得分:5)
来自Class class (getSimpleName method)的源代码:
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 "Binary Compatibility" (13.1)表明它(更精确但更简洁):
此外,生成的类文件必须具有某些属性。一个 特别选择这些属性的数量来支持源 保持二进制兼容性的代码转换。所需 属性是:
类或接口必须以其二进制名称命名,该名称必须是 满足以下限制条件:
顶级类型(第7.6节)的二进制名称是其规范名称 (§6.7)。
成员类型的二进制名称(§8.5,§9.5)由二进制组成 它的直接封闭类型的名称,后跟$,后跟 会员的简单名称。
本地类的二进制名称(第14.3节)由二进制名称组成 它的直接封闭类型,接着是$,然后是a 非空的数字序列,后跟本地的简单名称 类。
匿名类的二进制名称(第15.9.5节)由二进制组成 它的直接封闭类型的名称,后跟$,后跟a 非空数字序列。
泛型类或声明的类型变量的二进制名称 interface(§8.1.2,§9.1.2)是其立即的二进制名称 封闭类型,后跟$,后跟类型的简单名称 变量
泛型方法声明的类型变量的二进制名称 (§8.4.4)是声明方法的类型的二进制名称,如下所示 by $,后跟Java™中定义的方法描述符 虚拟机规范,Java SE 7版,后跟$, 后跟类型变量的简单名称。
泛型构造函数声明的类型变量的二进制名称 (§8.8.4)是声明构造函数的类型的二进制名称, 接着是$,后跟构造函数的描述符 在Java Java 7虚拟机规范Java SE 7中定义, 接着是$,后跟类型变量的简单名称。
因此可以说,众所周知的命名方案 完全规范化,我们可以依赖它(因为必须依赖所有类加载器来查找必要的类文件)。
答案 1 :(得分:0)
我认为命名方案没有在正式意义上指定,因为它(据说)是一个实现细节。