null 类型的参数应显式转换为 Class<?>[] 以调用 varargs 方法

请看一下下面的例子,这是在 Eclipse 中生成警告的第一个调用。第二个不起作用,并且失败,并带有 .getMethod()NoSuchMethodException

类型的参数应显式转换为,以便从类型 调用 varargs 方法。也可以将其转换为类以进行 varargs 调用。nullClass<?>[]getMethod(String, Class<?>...)Class<Example>

我遵循警告,没有任何效果。

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

该方法的第二个参数是 VarArg 参数。正确的用法是:如果反射方法没有参数,则不应指定第二个参数。如果反射方法具有参数,则应以下一种方式指定每个参数:getMethod

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
    }
}

更新

因此,在您的情况下,当您指定编译器时,不知道您指定了什么类型。当您尝试将 强制转换为未知但无论如何都是类的类时,您会得到一个例外,因为没有nullnull

public void exampleMethod(Class<?> object) { }

示例方法的签名。


答案 2

java API 中定义的 getMethod 是:

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]);