// до редактирования:
Ваша проблема в том, что getMethod
ищет public
члена.
Из Class.getMethod
(выделено мое):
Возвращает объект Method
, который отражает указанный открытый метод-член класса или интерфейса, представленный этим объектом класса
Итак, у вас есть два варианта:
- Сделайте
public void foo(String... s)
и используйте getMethod
- Используйте
getDeclaredMethod
вместо
Обратите внимание, что такая же разница существует для getField/s
против getDeclaredField/s
и getConstructor/s
против getDeclaredConstructor/s
.
// invoke
проблема
Это особенно неприятно, но получается, что invoke(Object obj, Object... args)
усложняет задачу, если вам нужно передать массив ссылочного типа в качестве единственного аргумента, потому что он может быть приведен к Object[]
, даже если это и должно быть вместо этого обернутый в new Object[1]
.
Вы можете сделать:
m.invoke(this, new Object[] {a}); // Bohzo's solution
Это обходит механизм варагга. Более кратко вы также можете сделать:
m.invoke(this, (Object) a);
Приведение к Object
заставляет механизм vararg создавать для вас массив.
Трюк также необходим при передаче null
в качестве аргумента varargs и не имеет ничего общего с отражением.
public void foo(String... ss) {
System.out.println(ss[0]);
}
foo(null); // causes NullPointerException
foo((String) null); // prints "null"