2009-08-20 68 views
5

私は255個のパラメータを持つコンストラクタ(自動生成クラス用)を持っています。 javac 1.6.0_02でLinux上でantを使用する。クラスはうまくコンパイルされ、すべてが良好です。私は、JDK 1.6を搭載したWindows XP上のEclipse内から同じクラスをコンパイルしようとすると、Javaコンパイルエラー:パラメータxが255ワードの制限を超えています

はしかし、私は次のエラー

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

BLAHは256番目のパラメータであり得ます。

この問題を解決する方法はありますか?自動生成されたクラスを変更することはオプションではありません。なぜなら、コンパイルごとに変更するか、ジェネレータを変更する必要があるからです。どちらのオプションも受け入れられません。私たちはすでにこのクラスをlinuxで手に入れることができるからです。

PS:興味のある方は、JavaクラスはJacORBを使ってIDLファイルから生成されます。残念ながら、クラス内のパラメータの数は、当社のソフトウェアと他のシステムとの間のインタフェースを定義するため、減らすことはできません。

+0

:o:o –

+0

私はそのクラスのインスタンスを作成するコードが好きです。 –

+0

私はこれがwsdl2java生成クラスであることに賭けています。 –

答えて

14

さてあなたはVM specification, section 4.10破壊している:私はあなたが生成されたコードを変更することで障害を克服示唆

The number of method parameters is limited to 255 by the definition of a method descriptor (§4.3.3), where the limit includes one unit for this in the case of instance or interface method invocations. Note that a method descriptor is defined in terms of a notion of method parameter length in which a parameter of type long or double contributes two units to the length, so parameters of these types further reduce the limit.

を...私はそれが正直に言うと、Linux上で動作しますかなり驚いています。私はではないでしょう。が生成したバイトコードが厳密に無効であれば、それは驚いています。

既存のコードをそのまま残し、限界を無視する方法を見つけようとするのは魅力的ですが、この場合はすぐにパラメータの数を減らすように注意する必要があります。

+0

@ Jean-FrançoisSavard:いいえ、少なくとも256個のパラメータがあるようです。したがって、 "BLAHは256番目のパラメータです"と "パラメータBLAHは255ワードの制限を超えています"。それで、私はまだそれがどこでも働くことに驚いています。 –

+0

あなたは正しいです、そして私はまた驚いています。 –

1

まあ、class file spec.は言う:

A method descriptor is valid only if it represents method parameters with a total length of 255 or less, where that length includes the contribution for this in the case of instance or interface method invocations. The total length is calculated by summing the contributions of the individual parameters, where a parameter of type long or double contributes two units to the length and a parameter of any other type contributes one unit.

2

2つのオプションこの問題を解決するためにあります。

  1. ないか、いくつかのコンストラクタ引数を使用してクラスを生成し、セッターを経由して、残りのパラメータを設定するには。ビルダーパターンを使うのと同じです。
  2. 3つまたは4つの変数を保持する単純なクラスを作成し、それらのより単純なオブジェクトを1つのマスタークラスに設定します。
関連する問題