代码如下:
public static void invokeOtherClassConstructor() {
Class<?> demo = null;
try {
demo = Class.forName("reflect.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Person per1=null;
Person per2=null;
Person per3=null;
Person per4=null;
Constructor<?> cons[] = demo.getConstructors();
try {
per2=(Person)cons[0].newInstance("Rollen");
per3=(Person)cons[1].newInstance(20);
per4=(Person)cons[2].newInstance("Rollen",20);
per1 = (Person)cons[3].newInstance();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println(per1);
System.out.println(per2);
System.out.println(per3);
System.out.println(per4);
}public static void main(String[] args) {
invokeOtherClassConstructor();
}
为什么run的时候会报java.lang.IllegalArgumentException: wrong number of arguments的错误?而debug就正确了。
public static void invokeOtherClassConstructor() {
Class<?> demo = null;
try {
demo = Class.forName("reflect.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Person per1=null;
Person per2=null;
Person per3=null;
Person per4=null;
Constructor<?> cons[] = demo.getConstructors();
try {
per2=(Person)cons[0].newInstance("Rollen");
per3=(Person)cons[1].newInstance(20);
per4=(Person)cons[2].newInstance("Rollen",20);
per1 = (Person)cons[3].newInstance();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println(per1);
System.out.println(per2);
System.out.println(per3);
System.out.println(per4);
}public static void main(String[] args) {
invokeOtherClassConstructor();
}
为什么run的时候会报java.lang.IllegalArgumentException: wrong number of arguments的错误?而debug就正确了。
解决方案 »
- 数据库里不能保存Object,为什么JDBC里还是有resultSet.getObject()的方法?
- JFrame 中怎么实现动画啊!!!!!!!小妹Java菜鸟,希望各位高人指点啊
- java mail的问题
- 一个关于文件IO的问题,有兴趣的过来看看!
- 最近要做beans?给点建议
- 关于java守护线程的问题
- 下面的线程到底用什么程序名来运行?是用Multi_Thread.java还是Multi_Thread fiel.java
- td 背景图像不显示 求大神门帮我看一下
- Android listview增加footerview后,footerview不在屏幕最下方显示,而是如果在listview的item后面显示
- filereader和fileinputstream的区别问题
- java socket的一点疑惑
- 今天看到一个有意思的运算题,有兴趣来看看。JSE的
per3=(Person)cons[1].newInstance(20);
per4=(Person)cons[2].newInstance("Rollen",20);
per1 = (Person)cons[3].newInstance();问题应该在这里吧,可能在RUN和DEBUG下,获取的构造函数顺序不相同。
而你在DEBUG下刚好是正确的,而在RUN下则出现问题。
DEBUG下,con[0] = Person(String name);
con[1] = Person(Integer age);
con[2] = Person(String name,Integer age);
con[3] = Person();
而RUN下,这些构造函数排列顺序不相同。
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package cn.dzr.question;import java.lang.reflect.Constructor;
import java.lang.reflect.TypeVariable;/**
*
* @author dzr
*/
public class ReflectTest {
public static void main(String[] rags) throws ClassNotFoundException
{
Class clazz = Class.forName("cn.dzr.domain.Person");
Constructor[] cons = clazz.getConstructors();
int i = 1;
for(Constructor con: cons)
{
System.out.print("第"+i+"个构造函数的名字 ");
System.out.println(con.getName());
System.out.println("第"+i+"个构造函数的参数列表 ");
// TypeVariable[] vars = con.getTypeParameters();
// System.out.println(vars);
// System.out.println(vars.length);
// System.out.println("下面打印TypeVariable");
Class[] cs = con.getParameterTypes();
System.out.println("该构造函数的参数个数为: "+cs.length);
// for(TypeVariable var :vars)
// {
// System.out.println(var.getName());
// }
// System.out.println("下面打印Class");
if(cs==null||cs.length==0)
System.out.println("这是一个无参构造函数!");
else
for(Class c:cs)
{
System.out.print(c.getName()+ " "); }
System.out.println();
i++;
}
}
}
记得int.class,和Integer.class是不一样的,constructor(1),类型是int,
lang3
有ConstructorUtils#public static <T> T invokeConstructor(Class<T> cls, Object[] args, Class<?>[] parameterTypes)
可以自己去研究,同个包下有很多反射的工具类