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

use*_*652 1 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);
        }
    }   

}
Run Code Online (Sandbox Code Playgroud)

为什么这段代码给了我nosuchmethod例外?任何解决方案吗?

Jon*_*eet 7

为什么这段代码给了我 nosuchmethod 异常?

因为您没有带有您请求的参数的构造函数:

(int, char, String, String)
Run Code Online (Sandbox Code Playgroud)

你只有一个带有这些参数的构造函数:

(int, char, String[])
Run Code Online (Sandbox Code Playgroud)

其中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] });
Run Code Online (Sandbox Code Playgroud)

创建 aString[]以传递给构造函数基本上就是编译器在调用时会为您执行的操作

new A(Integer.parseInt(args[1]), args[2].charAt(0), args[3], args[4])
Run Code Online (Sandbox Code Playgroud)


fge*_*fge 6

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

你应该:

s.getDeclaredConstructor(int.class, char.class, String[].class);
Run Code Online (Sandbox Code Playgroud)

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