类级交互的JVM字节码限制

Rex*_*err 15 java jvm bytecode

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

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

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

Ste*_*n C 5

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

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

如果确实需要引用那么多,那么应该做什么 - 将工作委托给多个类,每个类都可以有自己的<64k交互?

大概吧.

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