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

发布于 2024-10-31 05:26:58 字数 996 浏览 2 评论 0 原文

请看下面的示例,第一次调用 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)

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

Please have a look at the following example, the first call to getMethod() produces a Warning in Eclipse. The second one doesn't work and fails with a NoSuchMethodException.

The argument of type null should explicitly be cast to Class<?>[] for the invocation of the varargs method getMethod(String, Class<?>...) from type Class<Example>. It could alternatively be cast to Class for a varargs invocation.

I followed the warning and nothing worked anymore.

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

The second call produces this error:

Exception in thread "main" java.lang.NoSuchMethodException: 
    Example.exampleMethod(null)
        at java.lang.Class.getMethod(Class.java:1605)
        at Example.main(Example.java:12)

Can someone explain this behaviour to me? What's the correct way to avoid the warning?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

蛮可爱 2024-11-07 05:26:59

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 的签名。

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:

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

So, in your case, when you specify null the compiler doesn't know what type do you specify. When you try to cast the null to a Class which is unknown but anyway is a class, you get an exception because there is no

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

signature of exampleMethod.

一抹微笑 2024-11-07 05:26:59

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

The getMethod defined in java API is:

Method java.lang.Class.getMethod(String name, Class<?>... parameterTypes) 

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:

Method defaultNull = Example.class.getMethod("exampleMethod", new Class<?>[0]);

Invoke the method you should also set a empty array.

defaultNull.invoke(example , new Object[0]);
请远离我 2024-11-07 05:26:59

您没有将 null 转换为 Class[],而是将其转换为 Class。由于没有方法与该签名匹配,因此它会抛出异常。更正您的转换以正确识别数组。

You didn't cast null to Class<?>[], you cast it to Class<?>. Since no method matches that signature, it throws the exception. Correct your cast to properly identify the array.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文