Java反射 java.lang.NoSuchMethodException
 public static void testTT() throws Exception {
        Class<?> clazz = Class.forName("reflect.Person");
        // 获得构造器
        Constructor<?> constructor = clazz.getDeclaredConstructor(new Class[] {});
        // 根据类的默认构造器来获得一个对象
        Object instance = constructor.newInstance(new Object[] {});
        System.out.println(instance);

        Constructor<?> constructor2 = clazz
                .getDeclaredConstructor(new Class[] { Integer.class, String.class, Integer.class });
        Object instance2 = constructor2.newInstance(new Object[]{1,"Tom",21});
        System.out.println(instance2);
    }
 public Person(int id, String name, int age) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
    }
 Exception in thread "main" java.lang.NoSuchMethodException: reflect.Person.<init>(java.lang.Integer, java.lang.String, java.lang.Integer)
    at java.lang.Class.getConstructor0(Unknown Source)
    at java.lang.Class.getDeclaredConstructor(Unknown Source)

6个回答

Constructor<?> constructor2 = clazz.getDeclaredConstructor(new Class[] { int.class, String.class, int.class });

qq_37548112
qq_37548112 回复徐枫丶Forever: 了解,Thanks
3 年多之前 回复
xwl5242
徐枫丶Forever 回复qq_37548112: 两个类型不一样啊,int是基本数据类型,Integer是包装类是个类
3 年多之前 回复
qq_37548112
qq_37548112 恩,你的方法可以解决我的问题,int.class和Integer.class有什么区别?
3 年多之前 回复

Person类缺少无参构造方法,JAVA写了自己的构造方法以后,无参数的构造方法就认为不存在了,如果需要无参数的构造方法需要自己写出来。
解决方式:在你的Person类中加入无参数的构造方法
public Person() {

}
qq_37548112
qq_37548112 无参构造方法是有的
3 年多之前 回复

图片说明

qq_37548112
qq_37548112 恩,这个是个问题,主要是把int 和 Integer弄混了
3 年多之前 回复

你没有3个参数的构造,所以就错了,

qq_37548112
qq_37548112 在Person类中 无参构造方法和带3个参数的构造方法都有的说
3 年多之前 回复

sorry,刚没看到,你把那段代码改下:Constructor<?> constructor2 = clazz.getDeclaredConstructor(new Class[] { Integer.class, String.class, Integer.class });
改为:Constructor constructor2 = clazz.getDeclaredConstructor(new Class[] { Integer.class, String.class, Integer.class });
如此ok,注意"?"代表统配!!!何为统配?就是所有类都适用,何为所有类都适用?Object,然而Object没有有参构造,所以报上述错误,这里你最好采用自定义泛型,也就是假如你的工厂类为Factroy,定义为Factroy,然后Constructor就ok了,调用的时候需要出入泛型,传入Person.class,然而这里你没有定义泛型,所以当前代码解决方法如上述所说,Constructor如此解决,欢迎采纳!!!

呢个代码上去有问题是:
再发一遍:
图片说明

qq_37548112
qq_37548112 这个我倒没有试过,发现问题是Integer 和 int的问题,一个是类,一个是基本数据类型
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐