Различают, если метод имеет произвольное количество параметров через отражение - PullRequest
4 голосов
/ 09 июля 2019

Есть ли способ отличить эти два метода при использовании отражения для его вызова?

public void method(Object[] args) {}

public void method(Object... args) {}

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

Вы можете проверить, является ли Parameter параметром varargs, с помощью Parameter#isVarArgs().

Возвращает true, если этот параметр представляет список переменных аргументов; возвращает false в противном случае.


Интерфейс Executable имеет аналогичный метод , который реализуют Constructor и Method.

Возвращает true, если этот исполняемый файл был объявлен с переменным числом аргументов; возвращает false в противном случае.


Однако, если я правильно понимаю , почему вы задаете этот вопрос, зная, что эта информация вам не поможет. Является ли параметр varargs или нет, не влияет на то, как вы бы назвали Method#invoke. Как упоминает GhostCat и намекает на Ferrybig, вам нужно будет передать массив (в качестве единственного аргумента) в любом случае. См. этот вопрос для некоторых примеров.

1 голос
/ 09 июля 2019

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

Когда оба метода используются в отражении одинаково, почему это будет иметь значение, если в исходном коде указано «массив» или «varargs» ?!Видите ли, когда информация не обязательна для того, что вам нужно сделать, тогда хорошо не заботиться об этой детали.

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

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