Я собираюсь построить ОЧЕНЬ большой Java-класс, есть ли ограничение на количество методов, которые может иметь класс Java? Может ли он пойти на миллионы методов?
обновление: Цель состоит в том, чтобы сделать класс "Бог".
Я собираюсь построить ОЧЕНЬ большой Java-класс, есть ли ограничение на количество методов, которые может иметь класс Java? Может ли он пойти на миллионы методов?
обновление: Цель состоит в том, чтобы сделать класс "Бог".
В соответствии с спецификацией файла Java класса предел 65535:
4.10 Ограничения виртуальной машины Java
Следующие ограничения виртуальной машины Java неявны в формате файла
class
:
- Число методов, которые могут быть объявлены классом или интерфейсом, ограничено размером 65535 размером
methods_count
элемента структурыClassFile
(п .4.1). Обратите внимание, что значение элементаmethods_count
структурыClassFile
не включает методы, наследуемые от суперклассов или суперинтерфейсов.
Нет. Некоторые соответствующие фрагменты из спецификация формата файла класса:
Следующие ограничения виртуальной машины Java неявны в формате файла класса:
Пул констант для каждого класса или каждого интерфейса ограничен 65535 элементами 16-разрядного поля constant_pool_count структуры ClassFile (§ 4.1). Это действует как внутренний предел общей сложности одного класса или интерфейса.
Число методов, которые могут быть объявлены классом или интерфейсом, ограничено 65535 размером элемента method_count структуры ClassFile (§ 4.1). Обратите внимание, что значение элемента methods_count структуры ClassFile не включает методы, которые унаследованы от суперклассов или суперинтерфейсов.
Я думаю, это означает, что вы можете иметь 65535 методов, но только если у вас нет других объектов, которые занимают слоты в постоянном пуле (например, имена полей).
Кроме того, для каждого метода максимальный размер:
Хотя method_count в VM Spec является U2 и, следовательно, 65535, формат method_info имеет имя_индекс и дескриптор_индекса, оба из которых должны указывать в пул констант, который также имеет U2 constant_pool_count, поэтому 32767 является максимальным, даже это, конечно, невозможно, так как не допускает никаких других записей для имени класса, полей суперкласса и т.д.
Класс Java или интерфейс могут иметь не более 65535 методов. Код конструктора в Java ограничен 65535 байтами. Это также относится к максимальному количеству портов TCP/UDP, доступных на машине.