Eu tenho um construtor (para uma class gerada automaticamente) que possui 255 paremeters. Usando ant no linux com javac 1.6.0_02. A class compila bem e tudo é bom.
No entanto, quando eu tento compilar a mesma class de dentro do eclipse no windows xp com jdk 1.6, recebo o seguinte erro
Too many parameters, parameter BLAH is exceeding the limit of 255 words eligible for method parameters
BLAH
é o 256º parâmetro.
Existe uma maneira de superar esse problema? Alterar a class gerada automaticamente não é uma opção, pois eu precisaria alterá-la a cada compilation ou alterar o gerador. Ambas as opções não são aceitáveis porque já podemos obter essa class no linux.
PS: Para aqueles que estão interessados, a class java é gerada a partir de um arquivo IDL usando JacORB. Infelizmente, o número de parâmetros na class não pode ser reduzido, pois define uma interface entre o nosso software e outros sistemas.
Bem, você está quebrando a especificação da VM, seção 4.10 :
O número de parâmetros do método é limitado a 255 pela definição de um descritor de método (§4.3.3), onde o limite inclui uma unidade para isso no caso de invocações de método de instância ou interface. Observe que um descritor de método é definido em termos de uma noção de comprimento do parâmetro do método na qual um parâmetro do tipo longo ou duplo contribui com duas unidades para o comprimento, portanto, os parâmetros desses tipos reduzem ainda mais o limite.
Eu sugiro que você supere os obstáculos em mudar o código gerado … Estou muito surpreso que funciona no Linux, para ser honesto. Eu não ficaria totalmente surpreso se o bytecode gerado fosse estritamente inválido e, por acaso, esteja funcionando para você no momento.
Embora seja sempre tentador tentar encontrar maneiras de manter o código existente e ignorar os limites, acho que, nesse caso, você deve voltar sua atenção para a redução do número de parâmetros imediatamente.
Existem 2 opções para resolver este problema:
Bem, a especificação do arquivo de class. diz:
Um descritor de método é válido apenas se ele representar parâmetros de método com um comprimento total de 255 ou menos, em que esse comprimento inclui a contribuição para isso no caso de invocações de método de instância ou de interface. O comprimento total é calculado sumndo as contribuições dos parâmetros individuais, onde um parâmetro do tipo longo ou duplo contribui com duas unidades para o comprimento e um parâmetro de qualquer outro tipo contribui com uma unidade.