2009-08-20 8 views
5

J'ai un constructeur (pour une classe générée automatiquement) qui a 255 parémètres. Utilisation de Ant sur Linux avec javac 1.6.0_02. La classe compile bien et tout est bon.Java Erreur de compilation: Le paramètre x dépasse la limite de 255 mots

Cependant, lorsque je tente de compiler la même classe à partir d'Eclipse sur Windows XP avec JDK 1.6, je reçois l'erreur suivante

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

BLAH est le paramètre 256e.

Existe-t-il un moyen de résoudre ce problème? Changer la classe générée automatiquement n'est pas une option car je devrais la changer à chaque compilation ou changer le générateur. Les deux options ne sont pas acceptables car nous pouvons déjà obtenir cette classe sur Linux. PS: Pour ceux qui sont intéressés, la classe Java est générée à partir d'un fichier IDL utilisant JacORB. Malheureusement, le nombre de paramètres dans la classe ne peut pas être réduit car il définit une interface entre notre logiciel et d'autres systèmes.

+0

Pas moyen lol. : o: o –

+0

J'aimerais voir le code qui crée une instance de cette classe. –

+0

Mon pari est que c'est une classe générée par wsdl2java. –

Répondre

14

Eh bien, vous enfreignez la 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.

Je vous suggère de surmonter les obstacles à la modification du code généré ... Je suis assez surpris que cela fonctionne sur Linux, pour être honnête. Je ne serais pas entièrement surpris si le bytecode qu'il a généré était strictement invalide, et il se trouve justement à travailler pour vous en ce moment.

Bien qu'il soit toujours tentant de trouver des façons de respecter le code existant et d'ignorer les limites, je pense que dans ce cas, vous devriez porter votre attention sur la réduction immédiate du nombre de paramètres.

+0

@ Jean-FrançoisSavard: Non, on dirait qu'il y a au moins 256 paramètres - donc "BLAH" est le 256ème paramètre "et" le paramètre BLAH dépasse la limite de 255 mots ". Compte tenu de cela, je suis toujours surpris que cela fonctionne n'importe où. –

+0

Eh bien, vous avez raison, alors je suis également surpris. –

1

Eh bien, la class file spec. dit:

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

Il y a 2 options pour résoudre ce problème:

  1. Générez votre classe sans ou certains arguments du constructeur, puis définir les paramètres de repos par setters. Comme en utilisant le modèle de constructeur.
  2. Créez des classes plus simples contenant chacune 3 ou 4 variables et définissez ces objets plus simples dans 1 classe principale.
Questions connexes