Аргумент типа 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<?>. Поскольку никакой метод не соответствует этой сигнатуре, он выдает исключение. Исправьте свой бросок, чтобы правильно идентифицировать массив.