Ошибка компиляции Java: параметр x превышает ограничение в 255 слов - PullRequest
5 голосов
/ 21 августа 2009

У меня есть конструктор (для автоматически сгенерированного класса), который имеет 255 параметров. Использование муравья на Linux с Javac 1.6.0_02. Класс компилируется нормально и все хорошо.

Однако, когда я пытаюсь скомпилировать тот же класс из затмения на Windows XP с JDK 1.6, я получаю следующую ошибку

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

BLAH - это 256-й параметр.

Есть ли способ преодолеть эту проблему? Изменение автоматически сгенерированного класса не вариант, так как мне нужно будет менять его при каждой компиляции или изменении генератора. Оба варианта неприемлемы, потому что мы уже можем получить этот класс в Linux.

PS: Для тех, кто заинтересован, класс java генерируется из файла IDL с использованием JacORB. К сожалению, количество параметров в классе не может быть уменьшено, поскольку оно определяет интерфейс между нашим программным обеспечением и другими системами.

Ответы [ 3 ]

15 голосов
/ 21 августа 2009

Ну, вы нарушаете спецификацию VM, раздел 4.10 :

Количество параметров метода ограничено 255 по определению дескриптор метода (§4.3.3), где предел включает в себя одну единицу для этого в случай экземпляра или интерфейса вызовы методов. Обратите внимание, что метод дескриптор определяется в терминах Понятие длины параметра метода в какой параметр типа long или двойной вкладывает две единицы в длина, поэтому параметры этих типов далее уменьшить лимит.

Я предлагаю вам преодолеть препятствия в изменении сгенерированного кода ... Я очень удивлен, что он работает в Linux, если честно. Я не был бы полностью удивлен, если байт-код, который он сгенерировал, был строго недействителен, и он просто работает на вас в данный момент.

Хотя всегда соблазнительно пытаться найти способы соответствия существующему коду и игнорирования ограничений, я думаю, что в этом случае вам следует обратить ваше внимание на немедленное сокращение количества параметров.

2 голосов
/ 11 февраля 2016

Есть 2 варианта решения этой проблемы:

  1. Создайте свой класс без аргументов конструктора или без него, а затем установите параметры покоя с помощью установщиков. Как и при использовании шаблона Builder.
  2. Создайте более простые классы, каждый из которых содержит 3 или 4 переменные, и установите эти более простые объекты в 1 мастер-классе.
1 голос
/ 21 августа 2009

Ну, спецификация файла класса . говорит:

Дескриптор метода действителен, только если он представляет параметры метода с общей длиной 255 или менее, где эта длина включает в себя вклад для этого в случае экземпляра или метода интерфейса вызовы. Общая длина рассчитывается путем суммирования вклады отдельных параметров, где параметр типа long или double добавляет две единицы к длине и параметру любой другой тип добавляет одну единицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...