Во время выполнения получите количество параметров / аргументов, переданных методу, с или без varargs, в Java - PullRequest
0 голосов
/ 26 февраля 2019

Фон:

Я портирую код с другого языка.На этом языке конечные аргументы всегда являются необязательными .Такой метод, как: doIt( String x , Integer y , UUID z ), может быть вызван с нулевым, одним, двумя или тремя переданными аргументами.

Так что язык предлагает функцию countArguments.При переводе кода с этого языка на Java мне нужна функция на Java для замены каждого вхождения countArguments.


В современной Java, есть ли какой-нибудь способ получить количество параметров или аргументов, переданных методу?

Перегрузка метода

У нас есть перегрузка метода , каждый из которых принимает различное количество аргументов.Пример:

  • doIt( String x )
  • doIt( String x , Integer y )
  • doIt( String x , Integer y , UUID z )

Varargs

И мыhave varargs :

  • doIt( String x , Integer y , UUID z , BigDecimal... )

Получить количество аргументов

➥ Как получить фактическое количество переданных аргументовво время выполнения?

Пример:

public void doIt( String x ) {
    int countArguments = … ;  // Returns `1`. 
}

public void doIt( String x , Integer y ) {
    int countArguments = … ;  // Returns `2`.
}

public void doIt( String x , Integer y , UUID z , BigDecimal... ) {
    int countArguments = … ;  // Returns `3`, `4`, `5`, `6`, `7`, or more.
}

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Используйте AspectJ с Around или Before советом.
Вы получите JoinPoint, просто позвоните JoinPoint#getArgs();.

final Object[] arguments = joinPoint.getArgs();
final int count = arguments.length;

Вуаля.


Старый ответ.

Я портирую код с другого языка с помощью этой функции.Мне нужен способ эмулировать эту функцию "считать аргументы".Мне нужна функция в Java, чтобы заменить вызовы, сделанные для такой функции

Это не стоит того.Чтобы сделать это полностью автоматическим, вам нужно сделать

  1. Получить трассировку стека (Thread.currentThread().getStackTrace())
  2. Получить вызов имя метода , на один уровень вверхи номер строки
  3. Выполните синтаксический анализ класса с помощью инструмента манипулирования байт-кодом, такого как ByteBuddy или ASM, чтобы найти фактические аргументы метода.
  4. Передайте переменные,когда они присутствуют, в качестве входных данных для этого метода (метод, который я на самом деле описываю).
  5. Суммируйте аргументы, найденные путем анализа .class, с длиной varargs.

Других способов нет.Но это самоубийство

0 голосов
/ 27 февраля 2019

Частично это можно сделать с помощью отражения.Использование getEnclosingMethod():

public void doIt(String x, Integer y, BigDecimal... decimals) {
    int count = new Object(){}.getClass().getEnclosingMethod().getParameterCount();  // 3
}

Но обратите внимание, поскольку varargs является массивом, он будет рассматриваться как 1 аргумент.Чтобы получить длину этого массива, вам нужно получить значение.Но вы не можете получить какие-либо значения, используя отражение.В этом случае, вероятно, лучше использовать AOP , как предложено @ LppEdd

0 голосов
/ 26 февраля 2019

Если вы говорите о преобразовании, например, из JavaScript, где аргументы функции не определены, и у вас есть только 1 функция с заданным именем, то вам нужно проверить количество фактически переданных аргументов, чтобы выяснить, какая «перегрузка» извызывается функция, тогда ваш метод должен быть переведен в:

doIt(Object... args)

Длина массива - это число аргументов.

Конечно, именно так вы делаете это в JavaScript, потому чтоаргументы не определены, и перегрузка отсутствует.

В Java вы должны создавать перегруженные методы с различными списками аргументов, как показано в вопросе.В этих методах нет необходимости проверять количество аргументов, потому что список аргументов фиксирован.

Наличие кода, который проверяет количество аргументов, когда метод точно знает, сколько их существует (потому что они фиксированы), это нелепо, поэтому вопрос не имеет смысла в контексте без varargs Java.

Окончательный ответ:
Если у метода есть varargs, то проверьте длину массива.
Если метод не имеет переменных, проверка количества аргументов идиотична, и код не должен этого делать.

...