我想更好地理解类文件和内部/嵌套类,我想知道以下事情:
InnerClasses
属性用于引用'包含'类中的内部/嵌套类,还是在内部/嵌套类中用于引用'容器'类?InnerClasses
属性是否足够?例如。内部/嵌套类必须遵循$
的名称修改,还是只是一个约定?InnerClasses
属性,这取决于JLM供应商? (我记得听说IBM的实现在某些部分的要求不那么严格。)我尝试在JVM规范中查找它,但没有找到实际机制的描述。
我只在“The InnerClasses
Attribute”中找到与我的问题远程相关的句子:
Java虚拟机目前不检查其一致性 InnerClasses属性,实际代表一个类文件 属性引用的类或接口。
答案 0 :(得分:2)
上一个答案的一些补充:
InnerClasses属性是用于在包含的类中存储包含的内部/嵌套类,还是在内部/嵌套类中用于引用“容器”类?
每个编译类的字节码都存储在一个单独的.class文件中。实际的“内部类”不存储在该属性中。正如前一篇文章所指出的,该属性仅指向编译器在创建字节码时所知道的类。
类文件中的InnerClasses属性是否足够?例如。内部/嵌套类必须遵循名称mangling with $或者这只是一个惯例吗?
有没有办法让类看起来像JVM的内部/嵌套类而不设置InnerClasses属性,这取决于JLM供应商? (我记得听说IBM的实现在某些部分的要求不那么严格。)
对于这两个问题,我不确定。但我认为内部/嵌套类的概念是Java语言(因此Java编译器提供)的概念。在字节码中,声明为普通公共类的类与某些嵌套或内部类之间应该没有任何区别。 您可以轻松地尝试给定VM如何处理这个:
JVM的类加载机制与Java反射交互多少?是否有可能使JVM不同意Java反射的结果?
我不明白最后一个问题。当你说虚拟机和反射应该不一致时,你能解释一下你的意思吗?
答案 1 :(得分:1)
我知道类文件中有一个内部类属性,但这是否足够?
InnerClasses属性位于字节代码中,它列出了外部类的所有已知内部类。这不是你可以直接使用的东西。
E.g。内部/嵌套类必须遵循名称mangling with $或者这只是一个惯例吗?
编译器将遵循此约定,您无法控制它。
有没有办法让类看起来像JVM的内部/嵌套类而不设置内部类属性,这取决于JLM供应商? (我记得听说IBM的实现在某些部分的要求不那么严格。)
您可以创建具有相同名称的类。你可以亲自尝试一下。
JVM的类加载机制与Java反射交互多少?
我不相信类加载器使用反射。但是,反射可以从类加载器所在的相同位置获取其信息。我不明白为什么会这么重要。
是否有可能使JVM不同意Java反射的结果?
您可以使用反射来破坏基于反射的对象中的数据。再次,不知道你为什么要这样做。