2009-08-20 33 views
5

Tengo un constructor (para una clase autogenerada) que tiene 255 parámetros. Usando hormiga en linux con javac 1.6.0_02. La clase compila bien y todo está bien.Error de compilación de Java: el parámetro x excede el límite de 255 palabras

Sin embargo, cuando intento compilar la misma clase desde dentro de Eclipse en Windows XP con JDK 1.6, me sale el siguiente error

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

BLAH es el parámetro 256a.

¿Hay alguna manera de solucionar este problema? Cambiar la clase generada automáticamente no es una opción, ya que necesitaría cambiarla cada compilación o cambiar el generador. Ambas opciones no son aceptables porque ya podemos obtener esta clase en Linux.

PD: Para aquellos que estén interesados, la clase java se genera a partir de un archivo IDL utilizando JacORB. Desafortunadamente, la cantidad de parámetros en la clase no puede reducirse ya que define las interfaces entre nuestro software y otros sistemas.

+0

Ninguna manera lol. : o: o –

+0

Me encantaría ver el código que crea una instancia de esa clase. –

+0

Mi apuesta es que esto sea una clase generada por wsdl2java. –

Respuesta

14

bien que está rompiendo el 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.

Sugiero a superar los obstáculos en el cambio del código generado ... Estoy bastante sorprendido funciona en Linux, para ser honesto. No estaría por completo sorprendido si el bytecode que generó era estrictamente inválido, y parece que está funcionando para usted en este momento.

Si bien siempre es tentador tratar de encontrar formas de mantener el código existente e ignorar los límites, creo que en este caso debe centrarse en reducir el número de parámetros de inmediato.

+0

@ Jean-FrançoisSavard: No, parece que hay al menos 256 parámetros; por lo tanto, "' BLAH' es el parámetro 256 "y" el parámetro BLAH está excediendo el límite de 255 palabras ". Dado que, todavía estoy sorprendido de que funcione en cualquier lugar. –

+0

Bueno, tienes razón, entonces también estoy sorprendido. –

1

Bueno, el class file spec. dice:

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

Hay 2 opciones para resolver este problema:

  1. generar su clase sin o con algunos argumentos de constructor y después fijar los parámetros de descanso a través de los emisores. Como usar un patrón de constructor
  2. Haz clases más simples cada una con 3 o 4 variables y configura esos objetos más simples en 1 clase maestra.
Cuestiones relacionadas