2015-03-03 3 views
0

Имеявызова method.invoke с переменным числом аргументов

public Object callRemote (String sRemoteInterface, String sMethod, 
      Object... arguments); 

Я хочу сделать что-то вроде:

method.invoke(
      instance, 
      arguments..., 
      sessionId 
     ); 

Так это работает для методов с переменным числом аргументов.

Как я могу это сделать?

[EDIT] Вот фактический код, который я использую прямо сейчас. Она работает в течение 1 или 2-х аргументов, но это должно быть сделано общее для N аргументов:

public Object callRemote (String sRemoteInterface, String sMethod, 
      Object... arguments) throws Exception { 

    Object instance; 
    Method method; 

    if (sRemoteInterface==null) { 

     throw new Exception("Must specify a remote interface to locate."); 

    } 

    instance = this.locator.getRemoteReference(sRemoteInterface, this.sessionId); 

    if (arguments.length == 2) { 

     method = instance.getClass().getMethod(
      sMethod, 
      arguments[0].getClass(), 
      arguments[1].getClass(), 
      int.class 
     ); 

     return method.invoke(
      instance, 
      arguments[0], 
      arguments[1], 
      sessionId 
     ); 

    } else { 

     method = instance.getClass().getMethod(
      sMethod, 
      arguments[0].getClass(), 
      int.class 
     ); 

     return method.invoke(
      instance, 
      arguments[0], 
      sessionId 
     ); 

    } 

} 
+0

Я попытался использовать метод method.invoke (instance, arguments [0], arguments [1], sessionId); 'который работал, когда все методы имели два аргумента. Теперь у некоторых из них есть только один и другие 2, поэтому он не работает. Будет ли простая замена для метода method.invoke (instance, arguments, sessionId); 'работает для любого количества аргументов? – NotGaeL

+0

Не могли бы вы привести пример кода, который позволит нам воспроизвести вашу проблему? Может быть много проблем с отражением и varargs, но объяснение каждого из них в ответ займет очень много времени. – Pshemo

+0

опубликовал обновление с помощью всего метода. Я не знаю, правильно ли я это выражаю, но то, что я хочу сделать, сводится к вызову метода с помощью метода method.invoke, используя переменное количество аргументов аргументов, полученных в моем методе varargs 'callRemote'. – NotGaeL

ответ

1

Вы можете попробовать его с помощью следующей сниппет. Идея состоит в том, что вы передаете varargs через (getMethod также имеет varargs). Я пропустил код для создания экземпляра.

int sessionId; 

Object callRemote(Object instance, String sMethod, Object... arguments) throws Exception { 
    Class<?>[] argumentTypes = createArgumentTypes(arguments); 
    Method method = instance.getClass().getMethod(sMethod, argumentTypes); 
    Object[] argumentsWithSession = createArguments(arguments); 
    return method.invoke(instance, argumentsWithSession); 
} 

Object[] createArguments(Object[] arguments) { 
    Object[] args = new Object[arguments.length + 1]; 
    System.arraycopy(arguments, 0, args, 0, arguments.length); 
    args[arguments.length] = sessionId; 
    return args; 
} 

Class<?>[] createArgumentTypes(Object[] arguments) { 
    Class[] types = new Class[arguments.length + 1]; 
    for (int i = 0; i < arguments.length; i++) { 
     types[i] = arguments[i].getClass(); 
    } 
    types[arguments.length] = int.class; 
    return types; 
} 
+0

Именно то, что я искал. С незначительной коррекцией вы пропустили индекс (это должны быть аргументы [i] .getClass() '), это идея и реализация. Спасибо! – NotGaeL

Смежные вопросы