null 类型的参数应显式转换为 Class>[] 以调用 varargs 方法
请看下面的示例,第一次调用 getMethod()
会在 Eclipse 中产生警告。第二个不起作用,并因 NoSuchMethodException
失败。
null
类型的参数应显式转换为Class[]
以调用 varargs 方法getMethod(String, Class<; ?>...)
来自类型Class
。或者可以将其转换为 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)
有人可以向我解释这种行为吗?避免警告的正确方法是什么?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
getMethod
方法的第二个参数是 VarArg 参数。正确的用法是:
如果反射方法没有参数,则不应指定第二个参数。
如果反射的方法有参数,那么每个参数应该以下面的方式指定:
UPDATE
因此,在你的情况下,当你指定
null
时,编译器不知道什么您指定的类型。当您尝试将null
转换为未知但无论如何都是类的类时,您会收到异常,因为没有public void exampleMethod(Class object) { }
exampleMethod 的签名。
The second parameter to the
getMethod
method is a VarArg argument.The correct use is :
If reflected method has no parameter, then no second parameter should be specified.
If the reflected method has parameter, so each parameter should be specified in the next way:
UPDATE
So, in your case, when you specify
null
the compiler doesn't know what type do you specify. When you try to cast thenull
to a Class which is unknown but anyway is a class, you get an exception because there is nopublic void exampleMethod(Class<?> object) { }
signature of exampleMethod.
java API 中定义的 getMethod 是:
如果您调用的方法没有参数,那么您应该为第二个参数提供一个空数组或长度为 0 的数组。像这样:
调用该方法时您还应该设置一个空数组。
The getMethod defined in java API is:
If the method you called has no arguments,then you should supply a empty array or a array with 0 length for the second argument.like this:
Invoke the method you should also set a empty array.
您没有将
null
转换为Class[]
,而是将其转换为Class
。由于没有方法与该签名匹配,因此它会抛出异常。更正您的转换以正确识别数组。You didn't cast
null
toClass<?>[]
, you cast it toClass<?>
. Since no method matches that signature, it throws the exception. Correct your cast to properly identify the array.