【问题标题】:Is it specified anywhere that the numbers of anonymous classes start at 1?是否指定匿名类的数量从 1 开始?
【发布时间】:2012-09-04 16:12:04
【问题描述】:

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

【问题讨论】:

  • 根据stackoverflow.com/questions/1075207/…,“请注意,保存匿名内部类的文件的确切名称不是标准化的,可能会有所不同。但实际上我还没有看到除了所描述的方案之外的任何其他方案在这里。”
  • 我想这是一个答案 - 你应该这样发布,以便我接受。
  • 据我所知,没有这样的保证。但是理论上可以从父类文件的InnerClasses 属性中提取信息。这在实践中是否有效,我不知道。
  • 我尝试了这种方法(Apache BCEL 让这很容易),但我想看看是否有一种方法可以直接使用类加载器。
  • 所以它有效,很高兴知道。 :) 我同意第一条评论,实际上我没有看到任何偏离$1...$n 架构的实现。

标签: java class specifications


【解决方案1】:

JLS 13.1 指定:

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

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

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

【讨论】:

  • 注意,这也意味着扫描$1...$n只会返回直接封闭的内部类。这在技术上是正确的,但实际上人们会期望内部类的内部类也包括在内,这需要几轮嵌套的扫描。
【解决方案2】:

根据this answer

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-11
      • 2020-02-12
      • 2019-06-23
      • 2016-12-09
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多