15

我正在查看JVM 字节码指令,并惊讶地发现类之间的所有交互(例如强制转换new等)都依赖于常量池查找以查找其他类的标识。

我是否正确推断这意味着一个班级不能知道超过 64k 其他班级的存在,因为不可能引用他们?如果确实需要参考这么多,应该怎么做——将工作委托给多个类,每个类都可以有自己的 <64k 交互?

(这让我感兴趣的原因是我有编写代码生成器的习惯,有时会生成数千个不同的类,并且某些语言(例如 Scala)会大量创建类。因此,如果是真的,我似乎必须小心:如果我在一个类中有数百个方法,每个方法使用数百个(不同的)类,我可以超过常量池空间。)

4

2 回答 2

5

我是否正确推断这意味着一个班级不能知道超过 64k 其他班级的存在,因为不可能引用他们?

我认为你是对的。并且不要忘记其他东西有恒定的池条目;例如,所有类的方法和字段名称,以及它的所有文字字符串。

如果确实需要参考这么多,应该怎么做——将工作委托给多个类,每个类都可以有自己的 <64k 交互?

大概吧。

但是,我不相信这种担忧会在实践中实现。很难想象一个类需要直接与许多其他类交互......除非代码生成器忽略其输入源代码的结构。

于 2013-05-04T16:06:06.870 回答
1

听起来您的问题可以通过invokedynamic. 这基本上是一种更快的反射形式,旨在简化 JVM 上动态语言的实现。

如果您确实必须处理数千个自动生成的类,您可能不想将它们全部静态链接。只需使用invokedynamic. 这还具有让您将一些代码生成推迟到运行时的优势。

请注意,对于类调用的每个动态方法,您仍然需要一个常量池条目,但您不再需要引用实际的类和被调用的方法。事实上,您可以按需创建它们。

于 2013-05-04T16:18:40.927 回答