该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 属性中?它是由某处的规范强制执行的?
我的想法是:
Class.getDeclaredClasses)。您可以从第二段中注意到本地类或匿名类不被视为“成员”。
是的,他们不是会员。不过,它们仍然是内部类,所以它们通常会出现在这里。