Вам необходимо передать Object[][]
в этом случае:
Object[] allTheThings = new Object[] { "abc", true, 15 };
doItAll.invoke(o, new Object[]{allTheThings});
Причина в том, что один параметр things
преобразуется компилятором в один параметр типа Object[]
,и invoke
принимает массив со значениями параметров.
Рассмотрим метод с большим количеством параметров, чтобы сделать его более понятным:
void doMoreThings(Foo bar, Object ... things) { ... }
Object[] allTheThings = new Object[] { "abc", true, 15 };
doMore.invoke(o, new Object[]{new Foo(), allTheThings});
invoke
само объявлено, что оно принимает varargs,так что вы можете позволить компилятору создать внешний массив для вас.Но он не сделает этого, если вы передадите Object[]
, потому что он думает, что вы уже сделали это.Так что просто спрячьте этот факт от компилятора:
doItAll.invoke(o, (Object)allTheThings);
doMore.invoke(o, new Foo(), allTheThings);
Обратите внимание на приведение в первой строке, теперь компилятор больше не знает, что массив уже существует, поэтому он его создает.Во второй строке это не нужно, потому что у компилятора в любом случае нет другого шанса.
Редактировать : обратите внимание, что ваш код даже не компилируется, потому что вы пропустили передачу экземпляра классас doAllTheThings
методом до invoke
(я назвал его o
в моем коде).