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

时间:2012-08-23 07:48:01

标签: java specifications .class-file

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

VM-spec包含类文件格式的详细规范,但似乎没有说明它们应该如何命名以及它们应该存储在何处。同样,language-spec似乎没有触及此主题。

2 个答案:

答案 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)

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