Какое максимальное количество методов может иметь класс Java? - PullRequest
29 голосов
/ 03 декабря 2010

Я думаю создать ОЧЕНЬ большой класс Java, есть ли ограничения на количество методов, которые может иметь класс Java?Может ли он пойти на миллионы методов?

обновление: цель, да, создать класс "Бога".

Ответы [ 3 ]

53 голосов
/ 03 декабря 2010

В соответствии с спецификацией файла класса Java ограничение составляет 65535 :

4.10 Ограничения виртуальной машины Java

Следующие ограничения виртуальной машины Java подразумеваются в формате файла class:

  • Количество методов, которые могут быть объявлены классом или интерфейсом, ограничено 65535 размером methods_count элемент структуры ClassFile ( §4.1 ).Обратите внимание, что значение элемента methods_count структуры ClassFile не включает методы, унаследованные от суперклассов или суперинтерфейсов.
15 голосов
/ 03 декабря 2010

Нет.Некоторые важные части из спецификации формата файла класса :

Следующие ограничения виртуальной машины Java подразумеваются в формате файла класса:

  • Константный пул для класса или интерфейса ограничен 65535 записями 16-битным полем constant_pool_count структуры ClassFile (§4.1).Это действует как внутреннее ограничение общей сложности отдельного класса или интерфейса.

  • Количество методов, которые могут быть объявлены классом или интерфейсом, ограничено 65535 размеромэлемент method_count структуры ClassFile (§4.1).Обратите внимание, что значение элемента method_count структуры ClassFile не включает методы, унаследованные от суперклассов или суперинтерфейсов.

Я думаю, это означает, что у вас может быть 65535 методов, но только еслиу вас нет других объектов, которые занимают слоты в постоянном пуле (например, имена полей).

В дополнение к этому, существует также максимальный размер для каждого метода:

  • Объем кода для ненативного, неабстрактного метода ограничен 65536 байтами размерами индексов в таблице исключений атрибута кода (§4.7.3), в атрибуте LineNumberTable (§4.7.8), ив атрибуте LocalVariableTable (§4.7.9).
0 голосов
/ 27 ноября 2014

Хотя method_count в VM Spec равно U2, и, следовательно, 65535 формат method_info имеет name_index и descriptor_index, оба из которых должны указывать на постоянный пул, который также имеет U2 constant_pool_count, так что 32767 - это максимум, даже это, конечноневозможно, так как не допускает никаких других записей для имени класса, полей суперкласса и т. д.

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