java反射 利用反射机制产生实例

// 利用反射机制,产生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?)。

发布了5 篇原创文章 · 获赞 0 · 访问量 42

猜你喜欢

转载自blog.csdn.net/hello_momo/article/details/105367048