4

This answer to another question建议,作为通过反射查找匿名类的一种解决方法,只需尝试所有名称,从开始...$1并计数直到找不到更多名称。这是否可以保证找到所有内部类,或者是否存在它们从 0 开始或某些数字被遗漏的情况(无论出于何种原因)?

4

3 回答 3

6

JLS 13.1规定:

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

  • 顶级类型的二进制名称(第 7.6 节)是其规范名称(第 6.7 节)。
  • [...]
  • 匿名类的二进制名称(第 15.9.5 节)由其直接封闭类型的二进制名称组成,后跟 $,后跟非空数字序列。

所以理论上,它不必从 1 开始,但它必须类似于EnclosingClass$NN 是一个数字。

于 2012-09-04T16:20:07.157 回答
2

根据这个答案

请注意,包含匿名内部类的文件的确切名称不是标准化的,并且可能会有所不同。但在实践中,除了这里描述的方案,我还没有看到任何其他方案。

所以我想没有这样的保证。

于 2012-09-04T16:19:08.420 回答
0

在这个指向 java.sun.com教程的链接中,它解释了来自第 243 页的匿名类以及遵循所描述的命名约定的示例输出。例如 *$1.class、*$2.class 等。在第 246 页的顶部它说:

运行时匿名类的名称也显示在程序输出中。它们也是用于指定它们各自的类文件的名称。匿名类毕竟不是那么匿名。

考虑到本教程在 Oracle 网站上,几乎可以肯定这是一个不会改变的约定。希望这可以帮助 :)

于 2012-09-04T16:31:10.863 回答