// 利用反射机制,产生B 的实例
public class B {
// 无参数构造方法
public B() {
System.out.println("this is B");
}
// 一个参数的构造方法
public B(int m) {
System.out.println("this is B:" + m);
}
// 两个参数的构造方法
public B(String str, int m) {
System.out.println("this is B:" + str + m);
}
// 第一种方法
// 通过class类的无参getConstructors方法,获得Constructor对象组,其长度等于反射类中实际构造方法数量
public static void main(String[] args) throws Exception {
Class classInfo = Class.forName("com.reflect.testPackage1.B");
System.out.println("********************************构造方法************************************************");
Constructor constructors[] = classInfo.getConstructors();
// 打印一下B的所有构造方法,以便下面用到数组传参数
System.out.println("B 的Constructor变量如下。。。");
for (Constructor constructor : constructors) {
System.out.println(constructor.toString());
}
constructors[2].newInstance();
constructors[1].newInstance(15);
constructors[0].newInstance("stringtringringingngg", 20);
}
// 第二种方式
// 通过class类的有参getConstructor方法,来获得对应的一个构造方法信息,然后调用newInstance方法,完成该实例的创建过程。
public static void main(String[] args) throws Exception {
Class classInfo = Class.forName("com.reflect.testPackage1.B");
System.out.println("********************************构造方法************************************************");
Constructor constructors[] = classInfo.getConstructors();
// 打印一下B的所有构造方法,以便下面用到数组传参数
System.out.println("B 的Constructor变量如下。。。");
for (Constructor constructor : constructors) {
System.out.println(constructor.toString());
}
Constructor constructors2 = classInfo.getConstructor();
constructors2.newInstance();
Constructor constructors1 = classInfo.getConstructor(new Class[]{int.class});
// constructors1.newInstance(new Object[] {15}); // 和下面那句话运行结果相同
constructors1.newInstance(15);
Constructor constructors0 = classInfo.getConstructor(new Class[] {String.class, int.class});
// constructors0.newInstance(new Object[] {"stringtringringingngg", 20}); // 和下面那句话运行结果相同
constructors0.newInstance("stringtringringingngg", 20);
}
}
第一种方式的运行结果:
B 的Constructor变量如下。。。
public com.reflect.testPackage1.B(java.lang.String,int)
public com.reflect.testPackage1.B(int)
public com.reflect.testPackage1.B()
this is B
this is B:15
this is B:stringtringringingngg20
第二种方式的运行结果:
B 的Constructor变量如下。。。
public com.reflect.testPackage1.B(java.lang.String,int)
public com.reflect.testPackage1.B(int)
public com.reflect.testPackage1.B()
this is B
this is B:15
this is B:stringtringringingngg20
两种创建实例的方法,第二种更好一点(WHY?)。