|
为了做到使得程序具有更高的灵活性,可配置性,在开发中我们经常利用反射来创建一个类的实例,也就是获得一个类的一个对象!通常的做法是通过class.newInstance获得;但这种方法有一个不好的地方,那就是他只能创建无参构造器的对象,如果构造器有参数那它是无能为力的。
解决的方法就是 先通过该类的Class获得带有参数的构造器,然后通过得到的构造器和传如的初始化参数来创建实例!以下是上述做法的一个demo:
实体类:
package reflect;
public class Duck {
private Integer weight;
private String name;
public Duck(){
System.out.println("无参调用了");
}
public Duck(String name){
name=name;
System.out.println("one参调用了");
}
public Duck(String name,Integer weight){
name=name;
weight=weight;
System.out.println("Two参调用了");
}
}
package reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class ExeTest {
public static void main(String[] args) {
Class cls=Duck.class;
Class conargs[]={String.class,Integer.class};
try {
Constructor constructor=cls.getConstructor(conargs);
String name="abc";
Integer weight=new Integer(1056);
Object initargs []={name,weight};
constructor.newInstance(initargs);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} |
|