powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Рефлекшен - вызвать метод по имени с переменным числом аргументом.
9 сообщений из 9, страница 1 из 1
Рефлекшен - вызвать метод по имени с переменным числом аргументом.
    #38684297
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть "операция"

Код: java
1.
2.
3.
4.
5.
6.
class Operation {
    public Object object;
    public String method;
    public Object[] arguments;
    public Object[] data;
}



Как ее выполнить? Чтобы найти метод в классе нужно задать все аргументы

Код: java
1.
Method method = operation.object.getClass().getMethod(operation.method, param1.class, param2.class, ..)



Но их может быть разное число или не быть вовсе - как это можно сделать?
...
Рейтинг: 0 / 0
Рефлекшен - вызвать метод по имени с переменным числом аргументом.
    #38684298
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно реализовать что-то вроде

Код: java
1.
Utils.callMethod(operation.object, operation.method, operation.arguments)
...
Рейтинг: 0 / 0
Рефлекшен - вызвать метод по имени с переменным числом аргументом.
    #38684301
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Рефлекшен - вызвать метод по имени с переменным числом аргументом.
    #38684307
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем сделал чтобы все это заработало

Код: java
1.
2.
3.
4.
5.
6.
7.
private static void callMethod(Object object, String methodName, Object[] arguments) {
  Class[] argumentClasses = new Class[arguments.length];
  for(int j = 0; j < arguments.length; j++)
    argumentClasses[j] = arguments[j].getClass();
  Method method = object.getClass().getMethod(methodName, argumentClasses);
  method.invoke(object, arguments);
}



Но, это работает не всегда, например если мы хотим вызвать такой метод метод:

Код: java
1.
2.
3.
public void addTag(String tag, String[] oldTags)

callMethod(myObj, "addTag", ["C", ["A", "B"]])



То это работать не будет - он почему-то пытается развернуть последний массив и выкидывает ексепшен пытаясь найти несуществуюший метод

Код: java
1.
NoSuchMethodException: Post.addTag(String, String, String)
...
Рейтинг: 0 / 0
Рефлекшен - вызвать метод по имени с переменным числом аргументом.
    #38684309
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
private
Код: java
1.
callMethod(myObj, "addTag", ["C", ["A", "B"]])

Так работает:
Код: java
1.
callMethod(myObj, "addTag", new Object[] { "C", new String[] { "A", "B" } });
...
Рейтинг: 0 / 0
Рефлекшен - вызвать метод по имени с переменным числом аргументом.
    #38684312
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно переопределить метод так:
Код: java
1.
private static void callMethod(Object object, String methodName, Object...arguments) throws Exception { ... }

и можно будет вызывать методы таким образом:
Код: java
1.
2.
3.
4.
5.
6.
7.
public void addEmptyTag() { ... }
public void addTag(String tag) { ... }
public void addTag(String tag, String[] oldTags) { ... }

callMethod(console, "addTag", "C", new String[] { "A", "B" });
callMethod(console, "addTag", "C");
callMethod(console, "addEmptyTag"); // вызов метода без аргументов
...
Рейтинг: 0 / 0
Рефлекшен - вызвать метод по имени с переменным числом аргументом.
    #38684314
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, как оказалось - проблема была в другом, сам рефлекшен работает нормально.

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

public void add(Object... arguments) {}

Но, если мы вызываем его с массивом - как определить что там был массив?

add("A", "B") {}
add(["A", "B"]) {}

в обоих случаях arguments будет ["A", "B"]. А мне нужно чтобы сигнатура сохранялась - и во втором случае было [["A", "B"]] потому-что иначе потом не удается найти нужный метод через рефлекшен. Это как-то можно решить? Определить универсальный метод который может принимать чтоугодно и не терять сигнатуры?
...
Рейтинг: 0 / 0
Рефлекшен - вызвать метод по имени с переменным числом аргументом.
    #38684317
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
privateне удается найти нужный метод через рефлекшен. Это как-то можно решить?
Код: java
1.
object.getClass().getMethods()

перебираем методы с одинаковыми именами, которые без переменных аргументов (т.е. с условием ! isVarArgs()).
И только после этого искать методы с vararg-аргументами. А вообще именно для этого случая лучше добавить еще один call-метод:
Код: java
1.
callVarArgMethod()
...
Рейтинг: 0 / 0
Рефлекшен - вызвать метод по имени с переменным числом аргументом.
    #38684318
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, вариант, попробую.

П.С.

Почитал про вараргс, их еще оказывается можно вот так вызвать

add((Object) ["A", "B"]) {}

Тогда сигнатура сохранится.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Рефлекшен - вызвать метод по имени с переменным числом аргументом.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]