5

我有一个具有 255 个参数的构造函数(用于自动生成的类)。在带有 javac 1.6.0_02 的 Linux 上使用 ant。该类编译良好,一切都很好。

但是,当我尝试使用 jdk 1.6 在 windows xp 上的 eclipse 中编译相同的类时,出现以下错误

Too many parameters, parameter BLAH is exceeding the limit of 255 words eligible for method parameters

BLAH是第 256 个参数。

有没有办法克服这个问题?更改自动生成的类不是一个选项,因为我需要在每次编译或更改生成器时更改它。这两个选项都不可接受,因为我们已经可以在 linux 上获得这个类。

PS:对于那些感兴趣的人,java 类是使用 JacORB 从 IDL 文件生成的。不幸的是,类中的参数数量不能减少,因为它定义了我们的软件和其他系统之间的接口。

4

3 回答 3

16

好吧,您违反了VM 规范,第 4.10 节

根据方法描述符的定义(第 4.3.3 节),方法参数的数量限制为 255 个,在实例或接口方法调用的情况下,该限制包括一个单位。请注意,方法描述符是根据方法参数长度的概念定义的,其中 long 或 double 类型的参数为长度贡献了两个单位,因此这些类型的参数进一步降低了限制。

我建议您克服更改生成代码的障碍...老实说,我很惊讶它可以在 Linux 上运行。如果它生成的字节码是严格无效的,我不会完全感到惊讶,而且它恰好在此刻为你工作。

虽然尝试找到与现有代码保持一致并忽略限制的方法总是很诱人,但我认为在这种情况下,您应该立即将注意力转向减少参数的数量。

于 2009-08-20T22:50:23.270 回答
2

有 2 个选项可以解决此问题:

  1. 生成没有或一些构造函数参数的类,然后通过设置器设置其余参数。就像使用构建器模式一样。
  2. 制作更简单的类,每个类包含 3 或 4 个变量,并将这些更简单的对象设置在 1 个主类中。
于 2016-02-10T21:31:53.397 回答
1

好吧,类文件规范。说:

方法描述符仅在它表示总长度为 255 或更短的方法参数时才有效,其中该长度包括在实例或接口方法调用的情况下对此的贡献。总长度是通过对各个参数的贡献求和来计算的,其中 long 或 double 类型的参数贡献两个单位的长度,而任何其他类型的参数贡献一个单位。

于 2009-08-20T22:51:37.357 回答