Я пытаюсь понять отражение и в настоящее время копаюсь в том, как вызвать метод экземпляра, когда у вас есть только его имя в виде строки. По этой причине можно использовать 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 под капотом также преобразовывать все эти три аргумента в массив, или массив с аргументом используется только при вызове метода с использованием отражения?
Спасибо




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