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



请看下面的例子,第一次调用getMethod()会在Eclipse中产生一个警告。第二个不工作,并与NoSuchMethodException失败。

类型null的参数应该显式地转换为Class<?>[],以便从类型Class<Example>调用变量方法getMethod(String, Class<?>...)。对于varargs调用,也可以将其强制转换为Class。

我按照警告做了,但是什么都不起作用了。

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)
谁能给我解释一下这种行为?避免警告的正确方法是什么?

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

所以,在你的情况下,当你指定null时,编译器不知道你指定的是什么类型。当你试图将null转换为一个未知的类,但无论如何是一个类,你会得到一个异常,因为没有

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

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

您没有将null转换为Class<?>[],而是将其转换为Class<?>。由于没有方法与该签名匹配,因此会引发异常。

相关内容

最新更新