Как получить доступ к методу из внешнего JAR во время выполнения (часть 2)? - PullRequest
2 голосов
/ 25 августа 2009

Это продолжение поста Как получить доступ к методу из внешнего jar во время выполнения?

Макдауэлл ответил кодом:

public class ReflectionDemo {

public void print(String str, int value) {
    System.out.println(str);
    System.out.println(value);
}

public static int getNumber() { return 42; }

public static void main(String[] args) throws Exception {
   Class<?> clazz = ReflectionDemo.class;
   // static call
   Method getNumber = clazz.getMethod("getNumber");
   int i = (Integer) getNumber.invoke(null /* static */);
   // instance call
   Constructor<?> ctor = clazz.getConstructor();
   Object instance = ctor.newInstance();
   Method print = clazz.getMethod("print", String.class, Integer.TYPE);
    print.invoke(instance, "Hello, World!", i);
  }
}

Я добавил следующий метод:

public void print2(String[] strs){
  for(final String string : strs ){
      System.out.println(string);
  }
}

и модифицированный main для включения этих двух строк:

Method print2 = clazz.getDeclaredMethod("print2", new Class[]{String[].class});
print2.invoke(instance, new String[]{"test1", "test2"});

Однако вместо того, чтобы видеть

test1
test2

Я получаю следующее исключение:

Исключение в потоке "main" java.lang.IllegalArgumentException: неверное количество аргументов

Я прошел учебные пособия по Sun Java, перед вызовом я дал аргументам их собственный объект и перегрузил массивы, но все безуспешно. Кто-нибудь может объяснить, что я здесь делаю не так?

Спасибо, Тодд

1 Ответ

3 голосов
/ 25 августа 2009

Таковы проблемы с varargs!

print2.invoke(instance, new Object[] { new String[] {"test1", "test2"}});
...