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

时间:2011-04-07 19:58:56

标签: java reflection compiler-warnings variadic-functions

请查看以下示例,第一次调用getMethod()会在Eclipse中生成警告。第二个不起作用,并以NoSuchMethodException失败。

  

类型null的参数应显式转换为Class<?>[],以便从类型getMethod(String, Class<?>...)调用varargs方法Class<Example>。也可以将它转换为Class以进行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)

有人可以向我解释这种行为吗?什么是避免警告的正确方法?

3 个答案:

答案 0 :(得分:37)

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

exampleMethod的签名。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

您没有将null投射到Class<?>[],而是将其投放到Class<?>。由于没有方法匹配该签名,因此会抛出异常。纠正你的演员阵容以正确识别阵列。