В getMethod()
вы предоставляете массив классов длиной 1. Это несколько неверно; это должно работать из-за использования varargs, но это бессмысленно. Метод будет интерпретировать это так же, как просто предоставление одного класса. Буквальное добавление .class
к ожидаемым типам и разделение их запятыми должно дать правильный результат. Если бы у вас были String[]
и int
в качестве параметров в main()
, это выглядело бы как c.getMethod("main", String[].class, int.class)
.
В invoke()
, вы можете игнорировать первый параметр и передать null
, поскольку main()
это static
метод. Второй объявлен как параметр varargs, но в моем тесте это не сработало должным образом. Я приведу к одному Object
вместо массива длиной 1 Object
с. Здесь Object
работает как необработанный тип, так как invoke()
не информирован о том, какими должны быть его параметры во время компиляции, но может привести их к нужному типу во время выполнения.
Использование varargs в invoke()
не работает в этом случае, потому что ожидает тип Object[]
или разделенные запятыми значения, которые можно объединить в Object[]
. Проблема в том, что String[]
является подклассом Object[]
. Поэтому вместо интерпретации String[]
как одного String[]
метода invoke()
считает, что вы пытаетесь задать ему набор различных String
/ Object
входов.
Внутренняя логика c:
method.invoke(null, 1, 2, 3)
становится Object[]
с int
элементами. 3 отдельных int
параметра
method.invoke(null, "hello", "wow", "ok")
становятся Object[]
с String
элементами. 3 отдельных String
параметра
method.invoke(null, String[] { "hello", "wow", "ok" })
становятся Object[]
с String
элементами. 3 отдельных параметра String
, хотя нам нужен только один параметр String[]
Честно говоря, это не ваша вина, API не хватает хорошей документации для диагностики этих проблем. Не стесняйтесь задавать мне вопросы, эти вещи сбивают с толку.
try {
Class<?> c = Class.forName("Test");
Method m = c.getMethod("main", String[].class); // Needs parameter class list
String[] input = new String[] { "hello world" };
m.invoke(null, (Object) input);
}
catch (Exception e) {
e.printStackTrace();
}