2 u010877288 u010877288 于 2016.03.21 18:41 提问

java 反射 java.lang.IllegalArgumentException

package cn.com.reflect;

public class Person {

private String name;
private int age;

public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getAge() {
    return age;
}
public void setAge(int age) {
    this.age = age;
}
public Person(int age) {
    super();
    this.age = age;
}
public Person(String name) {
    super();
    this.name = name;
}
public Person() {
    super();
}
public Person(String name, int age) {
    super();
    this.name = name;
    this.age = age;
}

}

package cn.com.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class ReflectDemo4 {

public static void main(String[] args) {

    Class<?> clazz = null;
    try {
        clazz = Class.forName("cn.com.reflect.Person");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    Person demo1 = null;
    Constructor<?>[] con = clazz.getConstructors();
    try {
        demo1 = (Person) con[0].newInstance(12);
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }

    System.out.println(demo1.getAge());
}

}
java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at cn.com.reflect.ReflectDemo4.main(ReflectDemo4.java:20)
Exception in thread "main" java.lang.NullPointerException
at cn.com.reflect.ReflectDemo4.main(ReflectDemo4.java:31)

3个回答

snailplus
snailplus   2016.03.21 21:41

通过clazz.getConstructors()所获得的构造器的顺序,不一定是书写顺序。很可能是按参数从少到多排列的(未查证)。
你的con[0]获得的应该是个默认构造器,所以报错。你可以通过con[0]的getParameterTypes()来获得参数的个数,类型等信息进行判断,
进而确定要使用的构造器。
或者,干脆通过带参数的clazz.getConstructors(xxx,yyy。。。)函数,来明确获得一个你指定的参数列表的构造器。

yimiguan
yimiguan   2016.03.22 22:23

我按你的例子打了个断点,发现那些构造器的顺序是Person(),Person(java.lang.String), Person(java.lang.String,int), Person(int)。可见con[0]是默认构造器,所以报了个参数非法

luochoudan
luochoudan   Ds   Rxr 2016.03.23 09:07

yimiguan 童鞋给的是正解,顶一下。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Java反射异常:java.lang.IllegalArgumentException: wrong number of arguments
在用反射调用Hello.java的main方法时报了一个异常 java.lang.IllegalArgumentException: wrong number of argumentspackage classloader; public class Hello{ public static void main(String args[]){ for(String arg:
java反射 java.lang.IllegalArgumentException: wrong number of arguments
很多人学习反射的时候,回碰到的一个异常, 举个例子:这个类里面有四个构造函数 public class Person { public Person() { } public Person(String name) { this.name = name; } public Person(int age) { this.age = age; } public Pe
解析Java反射java.lang.IllegalArgumentException: wrong number of arguments
今天在写一个反射的例子的时候,遇到了java.lang.IllegalArgumentException: wrong number of arguments这个错误,后来看了源代码,才知道错误的原因,一个很低级的错误; 首先我的代码是这样写的:在我的jpa栏中注解的那块代码中: public void parse(Object obj, String methodName,String c
java反射 反射构造函数 报 wrong number of arguments 错误
今天学习reflect时,按照网上的讲解做的例子,但是写完运行后报 wrong number of arguments 代码如下 public class ReflectCase2 { public static void main(String[] args) { //通过Class调用其他类的构造函数 Class clas2 = null; try { clas
原创:Java反射中java.lang.IllegalArgumentException: wrong number of arguments异常
        时光如梭,转眼间到了2011年,新的一年,新的开始,希望同学们在这一年里有更大的收获. 我们开始了今年的第一个班级授课任务,这几天都忙于给学员加强java基础.    在忙于授课的同时,把今天学员遇到的第一个关于反射的bug:java.lang.IllegalArgumentException: wrong number ofarguments的问题解析如下:
使用JOOR实现Java反射
在前面的博客 Java反射使用 列举了Java反射的一些使用,下面介绍开源反射工具JOOR的使用。 只需几行代码就实现了前面博客中内部类的反射: public void testJoor(){ Reflect.on("com.example.heqiang.testsomething.OuterClass").create().field("mInnerClass").cal
深入理解 Java 反射:Field (成员变量)
读完本文你将了解到: Field 成员变量的介绍 获取变量的类型 获取成员变量的修饰符 获取和修改成员变量的值 常见错误 1 无法转换类型导致的 javalangIllegalArgumentException 常见错误 2反射非 public 的变量导致的 NoSuchFieldException 常见错误 3 修改 final类型的变量导致的 IllegalAccessException 总结
利用反射原理调用方法抛出异常:argument type mismatch
起因:自己弄得一个购物网站,这几个封装类都能显示正确的数值,唯独价格这里是double的默认值,说明用反射塞值出了错误。 查看代码:发现错误的原因在这里,给double类型的price设值得时候会报该异常 Price//对应下面code第一句打印 70//对应下面code第二句打印 java.lang.IllegalArgumentException: argument type mism
Java 反射机制(二)使用反射破坏单例,使用枚举加强单例
本文介绍了如何使用反射机制破坏传统的单例类,以及如何使用Java的枚举类创造出最简捷,最安全的单例。 反射的功能非常强大,普通的单例,将默认的无参构造方法私有化,但是利用反射机制任然可以实现对私有构造器的访问,实例化出多个对象。 1. 新建一个懒汉模式的单例类 SingleTonUtils.java /** * */ package com.jnk.think.java.chapt
使用Java的反射功能调用类中的方法
最近一直在搞Java的反射,今天使用反射调用方法时出现了很多问题,主要是没有详细参考官方API。所以走了很多弯路。 所以想把这个例子记下来,供自己也供他人学习。