我知道Java的方法不能大于64 KB。这种限制导致我们从JavaCC语法生成的代码出现问题。我们在使用Java 6时遇到了问题,并且能够通过更改语法来解决此问题。是否已针对Java 7更改了限制,或者已针对Java 8计划了限制?
为了清楚起见。我不需要一个大于64 KB的方法。但是我写了一个可以编译成很大方法的语法。
我知道Java的方法不能大于64 KB。这种限制导致我们从JavaCC语法生成的代码出现问题。我们在使用Java 6时遇到了问题,并且能够通过更改语法来解决此问题。是否已针对Java 7更改了限制,或者已针对Java 8计划了限制?
为了清楚起见。我不需要一个大于64 KB的方法。但是我写了一个可以编译成很大方法的语法。
Answers:
好问题。与往常一样,我们应该从源头中找到答案(“Java®虚拟机规范”)。该部分虽然没有明确提及限制(就像Java6 VM规范一样),但在某种程度上是出于谨慎的考虑:
调用方法(第2.6节)时创建的框架的局部变量数组中的最大局部变量数受Code属性(第4.7.3节)的max_locals项的大小(限制为65535)的限制,从而提供了方法的代码。方法,并通过Java虚拟机指令集的16位局部变量索引。
干杯,
它没有改变。在Java 7和Java 8中,方法中的代码限制仍然是64 KB。
参考文献:
类文件中Java虚拟机代码的静态约束指定了Java虚拟机指令必须在代码数组中的布局方式以及各个指令的操作数必须是什么。
对代码数组中指令的静态约束如下:
- 代码数组不能为空,因此code_length项的值不能为0。
- code_length项的值必须小于65536。
code_length项的值给出此方法在代码数组中的字节数。
code_length的值必须大于零(因为代码数组不能为空)且小于65536。