Java编译错误:参数x超出255个字的限制

时间:2009-08-20 22:41:13

标签: java compiler-errors

我有一个构造函数(用于自动生成的类),它有255个参数。在linux上使用ant和javac 1.6.0_02。该课程编写得很好,一切都很好。

然而,当我尝试使用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文件生成的。不幸的是,由于它定义了我们软件和其他系统之间的接口,因此无法减少类中的参数数量。

3 个答案:

答案 0 :(得分:15)

嗯,你打破了VM specification, section 4.10

  

方法参数的数量是   a的定义限制为255   方法描述符(§4.3.3),其中   限制包括一个单位   实例或接口的情况   方法调用。注意一个方法   描述符是根据a定义的   方法参数长度的概念   哪个参数类型为long或   双重贡献两个单位   长度,所以这些类型的参数   进一步减少限制。

我建议你克服改变生成代码的障碍......说实话,我很惊讶它适用于Linux。如果它生成的字节码严格无效,我就不会完全感到惊讶,而且恰好它恰好适合你。

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

答案 1 :(得分:2)

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

  1. 使用no或some构造函数参数生成类,然后通过setter设置rest参数。就像使用构建器模式一样。
  2. 制作更简单的类,每个类包含3个或4个变量,并在1个主类中设置这些更简单的对象。

答案 2 :(得分:1)

嗯,class file spec.说:

  

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