内部类属性

Kra*_*rab 5 java jvm class

InnerClasses属性描述说,

如果一个类的成员是类或接口,则其 constant_pool 表(及其 InnerClasses 属性)必须引用每个此类成员,即使该类没有以其他方式提及该成员。这些规则意味着嵌套类或接口成员将具有每个封闭类和每个直接成员的 InnerClasses 信息。

外层类信息索引:

如果 C不是类或接口的成员(即,如果 C 是顶级类或接口(JLS §7.6)或局部类(JLS §14.3)或匿名类(JLS §15.9.5) )), ...

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

package bc_data;

public class Pokus {

    public void metoda() {

        class Pokus_Lokalni {

        }

    }

}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

你可以看到本地类Pokus_Lokalni包含在 InnerClasses 属性中,即使类没有另外提到Pokus它,所以它被视为“成员”?或者为什么本地类Pokus_Lokalni包含在 InnerClasses 属性中?它是由某处的规范强制执行的?

Rad*_*def 2

我的想法是:

  • 为了反射的目的,需要强制将成员类包含在类文件中(因为例如Class.getDeclaredClasses)。
  • 对于本地类和匿名类来说情况并非如此,但无论如何都没有理由不能存储它们,即使没有强制要求。

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

是的,他们不是会员。不过,它们仍然是内部类,所以它们通常会出现在这里。