2012-01-12 3 views
2

Я пытаюсь вызвать метод с переменными аргументами, используя java-отражение. Вот класс, который принимает метод:Как вызвать метод с переменными аргументами в java с помощью отражения?

public class TestClass { 

public void setParam(N ... n){ 
    System.out.println("Calling set param..."); 
} 

Вот код ссылающееся:

try { 
     Class<?> c = Class.forName("com.test.reflection.TestClass"); 
     Method method = c.getMethod ("setParam", com.test.reflection.N[].class); 
     method.invoke(c, new com.test.reflection.N[]{}); 

Я получаю IllegalArgumentException в виде «неверное число аргументов» в последней строке, где я вызов invoke. Не уверен, что я делаю неправильно.

Любые указатели будут оценены.

  • Благодаря

ответ

9
public class Test { 

public void setParam(N... n) { 
    System.out.println("Calling set param..."); 
} 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) throws Exception { 
    Test t=new Test(); 
    Class<?> c = Class.forName("test.Test"); 
    Method method = c.getMethod ("setParam", N[].class); 
    method.invoke(t, (Object) new N[]{}); 
} 
} 

Работы для меня.

  1. Cast ваш N [], чтобы объект
  2. вызов вызова на экземпляре, а не на классе
+0

Пробовал это без приведения в '(Object)' - Я получаю то же исключение, что и вы. Так что просто добавьте актерский состав (и верните точку № 1), и все будет в порядке. – gorootde

+0

Сразу же, я упустил приведение к объекту []. Благодаря тонну. – Shamik

+0

@Shamik: если вы знаете, какой метод вы хотите назвать, можете избежать таких проблем, используя dp4j – simpatico

3

Там нет TestClass экземпляра в вашем фрагменте кода, на котором вынесено methd. Вам нужен пример TestClass, а не только TestClass. Вызвать newInstance() на c и использовать результат этого вызова в качестве первого аргумента method.invoke().

Кроме того, чтобы убедиться, что ваш массив рассматривается как один аргумент, а не с переменным числом аргументов, вам нужно, чтобы бросить его в объект:

m.invoke(testClassInstance, (Object) new com.test.reflection.N[]{}); 
+0

я так думал и пытался что раньше. Вот что я сделал. Класс c = Class.forName ("com.test.reflection.TestClass"); \t \t \t Объект iClass = c.newInstance(); Method method = c.getMethod ("setParam", com.test.reflection.N []. Class); method.invoke (iClass, new com.test.reflection.N [] {}); Я получаю исключение «неправильное количество аргументов». – Shamik

+0

Смотрите мои правки. Я тестировал его, и он работает. –

+0

большое спасибо, оцените вашу помощь. – Shamik

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