我正在浏览JVM bytecode instructions并惊讶地看到类之间的所有交互(例如,转换,new
等)依赖于对其他类的标识的常量池查找。 / p>
我是否正确地推断这意味着一个班级不能知道超过64k其他人的存在,因为无法引用它们?如果确实需要引用那么多,那么应该做什么 - 将工作委托给多个类,每个类都可以有自己的< 64k交互?
(我感兴趣的原因是我习惯于编写代码生成器,有时会产生数千个不同的类,并且某些语言(例如Scala)会大量创建类。所以看来如果是真的我必须要小心:如果我在一个类中有数百个方法,每个方法使用数百个(不同的)类,我可以超过常量池空间。)
答案 0 :(得分:5)
我是否正确地推断这意味着一个班级不能知道超过64k的其他人的存在,因为不可能引用它们?
我认为你是对的。并且不要忘记其他东西有不断的池条目;例如所有类方法和字段名称及其所有文字字符串。
如果确实需要引用那么多,那么应该做什么 - 将工作委托给多个类,每个类都可以有自己的< 64k交互?
我想是的。
但是,我不相信这个关注会在实践中实现。很难想象需要直接与许多其他类交互的类......除非代码生成器忽略其输入源代码的结构。
答案 1 :(得分:1)
听起来您的问题可以通过invokedynamic
解决。这基本上是一种更快速的反射形式,旨在简化JVM上动态语言的实现。
如果您确实需要处理数千个自动生成的类,您可能不希望将其全部静态链接。只需使用invokedynamic
即可。这也有一个优点,就是可以将一些代码生成推迟到运行时。
请注意,对于类调用的每个动态方法,您仍然需要一个常量池条目,但您不再需要引用要调用的实际类和方法。实际上,您可以按需创建它们。