5

私は255個のパラメーターを持つコンストラクター(自動生成されたクラス用)を持っています。Linuxでjavac1.6.0_02を使用してantを使用します。クラスは正常にコンパイルされ、すべてが良好です。

ただし、jdk1.6を使用してWindowsXPでEclipse内から同じクラスをコンパイルしようとすると、次のエラーが発生します。

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

BLAH256番目のパラメーターです。

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

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

4

3 に答える 3

16

さて、あなたはVM仕様、セクション4.10を破っています:

メソッドパラメータの数は、メソッド記述子の定義(§4.3.3)によって255に制限されています。この制限には、インスタンスまたはインターフェイスのメソッド呼び出しの場合、このための1つのユニットが含まれます。メソッド記述子は、メソッドパラメータの長さの概念で定義され、long型またはdouble型のパラメータが長さに2単位を与えるため、これらの型のパラメータはさらに制限を減らすことに注意してください。

生成されたコードを変更する際の障害を克服することをお勧めします...正直なところ、Linuxで動作することにかなり驚いています。それが生成したバイトコードが厳密に無効であったとしても、私はまったく驚かないでしょう。そして、それはたまたまあなたのために機能しているだけです。

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

于 2009-08-20T22:50:23.270 に答える
2

この問題を解決するには、次の2つのオプションがあります。

  1. コンストラクター引数がないか、いくつかあるクラスを生成してから、セッターを介してRESTパラメーターを設定します。ビルダーパターンを使用するようなものです。
  2. それぞれが3つまたは4つの変数を保持するより単純なクラスを作成し、それらのより単純なオブジェクトを1つのマスタークラスに設定します。
于 2016-02-10T21:31:53.397 に答える
1

さて、クラスファイルの仕様。言う:

メソッド記述子は、全長が255以下のメソッドパラメータを表す場合にのみ有効です。この長さには、インスタンスまたはインターフェイスのメソッド呼び出しの場合のこれに対する寄与が含まれます。全長は、個々のパラメーターの寄与を合計することによって計算されます。ここで、longまたはdoubleタイプのパラメーターは、長さに2単位を寄与し、他のタイプのパラメーターは1単位を寄与します。

于 2009-08-20T22:51:37.357 に答える