Java: преобразует ли Java аргументы метода в массив под капотом?

Я пытаюсь понять отражение и в настоящее время копаюсь в том, как вызвать метод экземпляра, когда у вас есть только его имя в виде строки. По этой причине можно использовать invoke из java.lang.reflect.Method. Что меня беспокоит, так это его подпись invoke(Object obj, Object... args), где первый аргумент — это экземпляр, для которого будет вызываться метод, а второй аргумент — это просто массив аргументов для вызова метода. В случае отражения передача аргументов в виде массива является единственным вариантом, поскольку invoke может вызывать метод с произвольным количеством аргументов. Что мне действительно интересно, так это то же самое происходит, когда вы вызываете метод напрямую (без отражения), аргументы также преобразуются в массив? Например. У меня есть такой метод void foo(int x, String s, Bar bar) в моем FooClass, и если я вызову foo обычным способом new FooClass().foo(7, "HelloWorld", new Bar()), будет ли Java под капотом также преобразовывать все эти три аргумента в массив, или массив с аргументом используется только при вызове метода с использованием отражения?
Спасибо

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нет, создание массива из аргументов вызовет слишком много накладных расходов. Массив используется только в ситуации invoke, потому что... что еще делать? Как бы вы разработали метод, который можно вызывать с произвольным количеством объектов и типов? Ваш единственный вариант - варарги Object... args. (кроме прямого массива, что делает его вызов более громоздким или перегружает, например, для вызова с 1, 2, 3,... аргументами)

«что еще делать». Ну, MethodHandle показывает, как может выглядеть альтернатива. Но в 1997 году у них не было такой идеи…

Holger 18.12.2020 09:51

Сигнатурные полиморфные методы — гениальный прием.

Johannes Kuhn 18.12.2020 23:11

Другие вопросы по теме