[英]Maximum number of parameters in Java method declaration
Java 中的方法最多可以有多少个参数,为什么?
我在 64 位 Windows 系统上使用 Java 1.8。
StackOverflow 上关于这个的所有答案都说技术限制是 255 个参数,但没有说明原因。
准确地说,static 为 255,非静态方法为 254(在this
例中为第 255 个)方法。
我认为这可以在某种规范中进行描述,并且只是静态定义了允许的最大参数数量。
但这仅对int
和所有 4 字节类型有效。 我用long
参数做了一些测试,在那种情况下我只能声明 127 个参数。
使用String
参数,我从测试中推导出的允许数量是 255(可能是因为引用大小是 Java 中的 4 个字节?)。
但是因为我使用的是 64 位系统,引用大小应该是 8 个字节宽,所以对于String
参数,最大允许数量应该是 127,类似于long
类型。
这个限制是如何准确应用的?
限制与方法的堆栈大小有什么关系吗?
注意:我真的不会在任何方法中使用这么多参数,但这个问题只是为了澄清确切的行为。
该限制在JVM规范中定义:
的方法的参数的数量由一方法描述符(§4.3.3),其中该限制包括这一个单元实例或接口方法调用的情况下的定义限制为255。
第§4.3.3节提供了一些额外的信息:
方法描述符仅在表示总长度为255或更小的方法参数时才有效,其中该长度包括在实例或接口方法调用的情况下对此的贡献。
总长度是通过对各个参数的贡献求和来计算的, 其中long或double类型的参数对长度贡献两个单位,而任何其他类型的参数贡献一个单位 。
您的观察结果是正确的,双字基元( long
/ double
)需要两倍于通常的4字节变量和4字节对象实例引用的大小 。
关于与64位系统相关的问题的最后一部分,规范定义了参数贡献了多少单位 ,即使在64位平台上也必须遵守规范的一部分,64位JVM将容纳255个实例参数(如255 Strings
)无论内部对象的指针大小如何。
JVM规范的4.3.3节包含您要查找的信息:
方法描述符仅在表示总长度为255或更小的方法参数时才有效,其中该长度包括在实例或接口方法调用的情况下对此的贡献。 总长度是通过对各个参数的贡献求和来计算的,其中 long或double类型 的参数对 长度 贡献两个单位 , 而任何其他类型 的 参数贡献一个单位 。
因此,主机是32位还是64位似乎对参数数量没有影响。 如果您注意到,文档以“单位”表示,其中一个“单位”的长度是单词大小的函数。 如果参数的数量与字大小成正比,则会出现可移植性问题; 您将无法在不同的体系结构上编译相同的Java程序(假设至少有一种方法使用具有较大字长的体系结构上的最大参数数)。
我在时事通讯中发现了一个有趣的问题, http://www.javaspecialists.eu/archive/Issue059.html
ClassFile结构的16位constant_pool_count字段将每类或每接口常量池限制为65535个条目。 这是对单个类或接口的总复杂性的内部限制。 每个非本机非抽象方法的代码量由Code属性的exception_table,LineNumberTable属性和LocalVariableTable属性中的索引大小限制为65536字节。
在调用方法时创建的帧的局部变量数组中最大数量的局部变量被Code35属性的max_locals项的大小限制为65535,该属性给出了方法的代码。 请注意,long和double类型的值都被认为是保留两个局部变量并为max_locals值提供两个单位,因此使用这些类型的局部变量会进一步降低此限制。
可以由类或接口声明的字段数量被ClassFile结构的fields_count项的大小限制为65535。 请注意,ClassFile结构的fields_count项的值不包括从超类或超接口继承的字段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.