Class JVM如何决定类“;属于”;(例如内部类或嵌套类)到另一个类?

Class JVM如何决定类“;属于”;(例如内部类或嵌套类)到另一个类?,class,language-agnostic,jvm,bytecode,vm-implementation,Class,Language Agnostic,Jvm,Bytecode,Vm Implementation,我想更好地理解类文件和内部/嵌套类,我想知道以下几点: InnerClasses属性用于引用“包含”类中的内部/嵌套类,还是用于内部/嵌套类中引用“容器”类 类文件中的InnerClasses属性是否足够?例如,内部/嵌套类是否必须跟随名称mangling with$ 有没有一种方法可以在不设置InnerClasses属性的情况下使类看起来像JVM的内部/嵌套类,这是否取决于JLM供应商?(我记得听说IBM的实现在某些部分的要求不那么严格。) JVM的类加载机制在多大程度上与Java反射交互?

我想更好地理解类文件和内部/嵌套类,我想知道以下几点:

  • InnerClasses
    属性用于引用“包含”类中的内部/嵌套类,还是用于内部/嵌套类中引用“容器”类
  • 类文件中的
    InnerClasses
    属性是否足够?例如,内部/嵌套类是否必须跟随名称mangling with
    $
  • 有没有一种方法可以在不设置
    InnerClasses
    属性的情况下使类看起来像JVM的内部/嵌套类,这是否取决于JLM供应商?(我记得听说IBM的实现在某些部分的要求不那么严格。)
  • JVM的类加载机制在多大程度上与Java反射交互?是否有可能使JVM与Java反射的结果不一致
我试图在JVM规范中查找它,但没有找到实际机制的描述

我只发现这句话与我的问题有着千丝万缕的联系:

Java虚拟机当前不检查 InnerClasses属性,其中任何类文件都实际表示 属性引用的类或接口

我知道类文件中有一个内部类属性,但这足够了吗

InnerClasses属性位于字节码中,它列出了外部类的所有已知内部类。这不是你可以直接使用的东西

例如,内部/嵌套类是否必须在名称mangling后面加上$mangling,或者这只是一种约定

编译器将遵循此约定,您无法控制它

有没有一种方法可以使类在JVM中看起来像一个内部/嵌套类,而不设置内部类属性,这是否取决于JLM供应商?(我记得听说IBM的实现在某些部分的要求不那么严格。)

可以创建具有相同名称的类。你可以自己试试

JVM的类加载机制在多大程度上与Java反射交互

我不相信类加载器使用反射。但是,反射可以从类装入器所在的位置获取信息。我不明白这有什么关系

是否有可能使JVM与Java反射的结果不一致


可以使用反射损坏基于反射的对象中的数据。同样,也不确定为什么要这样做。

对前面的答案进行了一些补充:

InnerClasses属性用于在包含类中存储包含的内部/嵌套类,还是在内部/嵌套类中用于引用“容器”类

每个编译类的字节码都存储在单独的.class文件中。实际的“内部类”不存储在该属性中。正如前一篇文章所指出的,该属性只指向编译器在创建字节码时知道的类

类文件中的InnerClasses属性是否足够?例如,内部/嵌套类是否必须在名称mangling后面加上$mangling,或者这只是一种约定

有没有一种方法可以使类在JVM中看起来像一个内部/嵌套类,而不设置InnerClasses属性,这是否取决于JLM供应商?(我记得听说IBM的实现在某些部分的要求不那么严格。)

对于这两个问题,我都不确定。但是我认为内部/嵌套类的概念是Java语言(因此Java编译器提供)的。在字节码中,声明为普通公共类的类与某些嵌套类或内部类之间不应有任何区别。 您可以很容易地尝试给定VM如何处理这种情况:

  • 创建一个包含一些嵌套类和内部类的类
  • 编写一个小程序,尝试从定义类的范围之外通过反射加载和实例化一个内部类。您必须在这里使用反射,因为Java编译器不允许您实例化不在范围内的嵌套类!如果您能够成功地实例化该类,这表明VM在内部不会以不同方式处理嵌套类和普通类
JVM的类加载机制在多大程度上与Java反射交互?是否有可能使JVM与Java反射的结果不一致


我不明白最后一个问题。当你说VM和反射不一致时,你能再解释一下你的意思吗?

也许你可以说你更具体想知道的,比如为什么你需要知道这个?我问这个问题是因为我对不同的JVM如何处理上面提到的事情感兴趣,考虑到没有关于如何做的特定标准。这纯粹是兴趣,这就是为什么“你为什么要这么做?使用
javac
!”对我没有帮助。@soc,我说的是“使用javac”。也许告诉你不要担心你不需要担心的细节是我帮助你的想法Haskell有内部类吗?如果没有检查内部类,那么是否检查了也没关系,您是否设置了它。我确信这位实习生确信他做得很好,并且也完成了工作。我认为你需要阅读这篇文章,否则你可能会发现你在浪费时间。在阅读了你下面的评论后,我决定不回答你的问题。我在这里留下这条评论只是想向你指出,你下面的互动方式可能不是在请求社区帮助时与社区互动的最佳方式。谢谢你的好话。我认为答案可以归结为“你为什么想知道这些?”是傲慢而不是认可