Аргумент типа null должен быть явно передан классу <?> [] Для вызова метода varargs
Обратите внимание на следующий пример: первый вызов getMethod()
вызывает предупреждение в Eclipse. Второй не работает и не работает с NoSuchMethodException
.
Аргумент типа null
должен быть явно добавлен к Class<?>[]
для вызова метода varargs getMethod(String, Class<?>...)
из типа Class<Example>
. В качестве альтернативы он может быть передан классу для вызова varargs.
Я следил за предупреждением и ничего больше не работал.
import java.lang.reflect.Method;
public class Example
{
public void exampleMethod() { }
public static void main(String[] args) throws Throwable
{
Method defaultNull = Example.class.getMethod("exampleMethod", null);
Method castedNull = Example.class.getMethod("exampleMethod", (Class<?>) null);
}
}
Второй вызов вызывает эту ошибку:
Exception in thread "main" java.lang.NoSuchMethodException:
Example.exampleMethod(null)
at java.lang.Class.getMethod(Class.java:1605)
at Example.main(Example.java:12)
Может кто-нибудь объяснить мне такое поведение? Какой правильный способ избежать предупреждения?
Ответы
Ответ 1
Второй параметр метода getMethod
является аргументом VarArg.
Правильное использование:
Если отраженный метод не имеет параметра, то второй параметр не должен указываться.
Если отраженный метод имеет параметр, поэтому каждый параметр должен быть указан следующим образом:
import java.lang.reflect.Method;
public class Example {
public void exampleMethodNoParam() {
System.out.println("No params");
}
public void exampleMethodWithParam(String arg) {
System.out.println(arg);
}
public static void main(String[] args) throws Throwable {
Example example = new Example();
Method noParam = Example.class.getMethod("exampleMethodNoParam");
Method stringParam = Example.class.getMethod("exampleMethodWithParam", String.class);
noParam.invoke(example);
stringParam.invoke(example, "test");
//output
//No params
//test
}
}
UPDATE
Итак, в вашем случае, когда вы указываете null
, компилятор не знает, какой тип вы укажете. Когда вы пытаетесь применить null
к классу, который неизвестен, но в любом случае это класс, вы получаете исключение, потому что нет
public void exampleMethod(Class<?> object) { }
подписи exampleMethod.
Ответ 2
Метод getMethod, определенный в java API:
Method java.lang.Class.getMethod(String name, Class<?>... parameterTypes)
Если вызванный вами метод не имеет аргументов, вы должны указать пустой массив или массив с длиной 0 для второго аргумента. Например:
Method defaultNull = Example.class.getMethod("exampleMethod", new Class<?>[0]);
Вызвать метод, который вы также должны установить пустой массив.
defaultNull.invoke(example , new Object[0]);
Ответ 3
Вы не добавили null
в Class<?>[]
, вы добавили его в Class<?>
. Поскольку никакой метод не соответствует этой сигнатуре, он выдает исключение. Исправьте свой бросок, чтобы правильно идентифицировать массив.