2009-08-20 3 views
5

Ich habe einen Konstruktor (für eine automatisch generierte Klasse), der 255 Parameter hat. Verwenden von ant unter Linux mit javac 1.6.0_02. Die Klasse kompiliert gut und alles ist gut.Java Kompilierfehler: Parameter x überschreitet die Grenze von 255 Wörtern

aber wenn ich versuche, die gleiche Klasse zu kompilieren aus Eclipse auf Windows XP mit JDK 1.6, erhalte ich die folgenden Fehler

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

BLAH die der 256. Parameter ist.

Gibt es eine Möglichkeit, dieses Problem zu lösen? Das Ändern der automatisch generierten Klasse ist keine Option, da ich sie bei jeder Kompilierung ändern oder den Generator ändern müsste. Beide Optionen sind nicht akzeptabel, da wir diese Klasse bereits unter Linux erhalten können.

PS: Für diejenigen, die interessiert sind, wird die Java-Klasse aus einer IDL-Datei mit JacORB generiert. Leider kann die Anzahl der Parameter in der Klasse nicht reduziert werden, da sie Schnittstellen zwischen unserer Software und anderen Systemen definiert.

+0

Kein Weg lol. : o: o –

+0

Ich würde gerne den Code sehen, der eine Instanz dieser Klasse erstellt. –

+0

Meine Wette ist, dass dies eine wsdl2java generierte Klasse ist. –

Antwort

14

Nun du brichst die 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.

ich Ihnen die Hindernisse zu überwinden, deuten darauf hin, in den generierten Code zu ändern ... Ich bin ziemlich überrascht, dass es unter Linux funktioniert, ehrlich zu sein. Ich würde nicht ganz überrascht sein, wenn der Bytecode, den es erzeugte, absolut ungültig war, und es gerade geschieht, um für Sie im Moment zu arbeiten.

Während es immer verlockend ist, Wege zu finden, um mit dem bestehenden Code zu bleiben und die Grenzen zu ignorieren, denke ich, in diesem Fall sollten Sie Ihre Aufmerksamkeit darauf richten, die Anzahl der Parameter sofort zu reduzieren.

+0

@ Jean-FrançoisSavard: Nein, es sieht so aus, als gäbe es mindestens 256 Parameter - daher ist "BLAH" der 256. Parameter "und" Parameter BLAH überschreitet die Grenze von 255 Worten ". Angesichts dessen bin ich immer noch überrascht, dass es überall funktioniert. –

+0

Nun, du hast recht, dann bin ich auch überrascht. –

1

Nun, die class file spec. sagt:

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

Es gibt zwei Möglichkeiten, dieses Problem zu beheben:

  1. Ihre Klasse mit nicht generieren oder einigen Konstruktorargumente und setzen Rest Parameter über Setter. Wie mit Builder-Muster.
  2. Erstellen Sie einfachere Klassen, die jeweils 3 oder 4 Variablen enthalten, und legen Sie diese einfacheren Objekte in einer Master-Klasse fest.