为什么它没有给我这样的方法例外

  • 本文关键字:方法 java reflection
  • 更新时间 :
  • 英文 :

import java.lang.reflect.Constructor;
class tr1 {
    public static void main(String[] args) {
        try {
            if (args.length < 1)
                throw(new Exception("baby its wrong"));
            Class s = Class.forName(args[0]);
            Constructor c = s.getDeclaredConstructor(int.class, char.class, String.class, String.class);
            Object o = c.newInstance(Integer.parseInt(args[1]), args[2].charAt(0), args[3], args[4]);
            System.out.println("description of object " + o);
        } catch (Exception e) {
            System.out.println(e);  
        }
    }   
}
class A {
    public A(int a, char c, String... strings){
        System.out.println(a);
        System.out.println(c);
        for (String q:strings) {
            System.out.println(q);
        }
    }   
}

为什么这段代码给我NoSuchMethod异常?有解决办法吗?

为什么这段代码没有给我suchmethod异常?

因为你没有一个带有你所请求的参数的构造函数:

(int, char, String, String)

构造函数只有以下参数:

(int, char, String[])

,其中String[]是一个变量参数。

存在一个varargs参数的事实基本上是一个编译时工件。您可以在执行时使用Constructor.isVarArgs()检测到这一点,但这不会改变构造函数的签名。

有解决方案吗?

使用现有的构造函数:)

Constructor c = s.getDeclaredConstructor(int.class, char.class, String[].class);
Object o = c.newInstance(Integer.parseInt(args[1]),
                         args[2].charAt(0),
                         new String[] { args[3], args[4] });

创建一个传递给构造函数的String[],基本上就是如果你调用

,编译器会为你做的事情
new A(Integer.parseInt(args[1]), args[2].charAt(0), args[3], args[4])

因为省略号是数组的语法糖。

你应该:

s.getDeclaredConstructor(int.class, char.class, String[].class);

(正如@JonSkeet在他的回答中提到的,您还应该使您的第三个参数在.newInstance()调用中成为一个数组)

相关内容

  • 没有找到相关文章

最新更新