InnerClasses attribute描述说

如果类具有作为类或接口的成员,则其
constant_pool表(及其内部InnerClasses属性)必须引用
给每个这样的成员,即使该成员没有被其他提及
班上。这些规则意味着嵌套的类或接口成员
对于每个封闭类以及每个类都有InnerClasses信息
每个直属成员。

external_class_info_index:

如果C是,而不是类或接口的成员(即,如果C是,则a
顶级类或接口(JLS§7.6)或本地类(JLS§14.3)
或匿名类(JLS§15.9.5)),...

您可以从第二段中注意到,本地类或匿名类未被视为“成员”。这意味着第一段不适用于本地类或匿名类。但是当我编译这段代码(尝试过eclipse编译器和javac)时:

package bc_data;

public class Pokus {

    public void metoda() {

        class Pokus_Lokalni {

        }

    }

}

javap -v Pokus.class
Classfile /home/jara/projects/bp/bc_data/src/bc_data/Pokus.class
  Last modified May 15, 2015; size 321 bytes
  MD5 checksum cf9cd7707c297e7ba43b8408a9ff6e2f
  Compiled from "Pokus.java"
public class bc_data.Pokus
  SourceFile: "Pokus.java"
  InnerClasses:
       #5= #4; //Pokus_Lokalni=class bc_data/Pokus$1Pokus_Lokalni
  minor version: 0
  major version: 51
  flags: ACC_PUBLIC, ACC_SUPER

您可以看到InnerClasses属性中包含本地类Pokus_Lokalni,即使类Pokus并未另行提及,也可以将其视为“成员”吗?还是为什么在InnerClasses属性中包含本地类Pokus_Lokalni?它是由规范强制执行的吗?

最佳答案

我的想法是:

  • 出于反射的目的,必须强制成员类包含在类文件中(例如 Class.getDeclaredClasses )。
  • 对于本地和匿名类而言并非如此,但是即使没有强制要求也没有理由不能存储它们。

  • 您可以从第二段中注意到,本地类或匿名类未被视为“成员”。

    是的,他们不是会员。它们仍然是内部类,因此它们将正常显示在这里。

    07-27 17:31