java反射机制学习(二):通过反射获取构造方法并实例化对象

通过反射实例化SUser对象

public static void main(String[] args) {
	Class<?> c = null;
	try{
		c = Class.forName("com.wjl.reflect.SUser");//实例化class
		SUser user = null;
		user = (SUser)c.newInstance();//实例化SUser类
//			(要求SUser类必须有无参构造方法,否则报错:java.lang.InstantiationException
		//因为newInstance()方法调用的是SUser类的无参构造方法进行的实例化	)
		user.setUserName("admin");
		user.setPassWord("123456");
		System.out.println(user);//默认调用toString方法
	}catch(Exception e){
		e.printStackTrace();
	}
}

以上方法有一个问题:SUser对象必须有无参构造方法,若是没有则会报错 ,解决方法有俩:一个是为SUser明确指定无参构造方法,二是通过Class实例化SUser对象时指定构造方法。

指定构造方法测试代码如下:

public static void main(String[] args){
	Class<?> c = null;
	try{
		c = Class.forName("com.wjl.reflect.SUser");//实例化class
		//获取class所在类的所有构造方法
		Constructor<?> con[] = null;
		con = c.getConstructors();//获取SUser类中的所有构造方法
		for(int i=0;i<con.length;i++){
			System.out.println(con[i]);
			//SUser类中定义了三个构造方法,输出结果依次为:
			/*
			public com.wjl.reflect.SUser(java.lang.String)
			public com.wjl.reflect.SUser(java.lang.String,java.lang.String)
			public com.wjl.reflect.SUser()
			*/
		}
		SUser user = null;
		SUser user2 = null;
		SUser user3 = null;
		user = (SUser)con[0].newInstance("admin");//带一个参数
		user2 = (SUser)con[1].newInstance("admin","123456");//带两个参数
		user3 = (SUser)con[2].newInstance();//没有参数
		//以上三个构造方法分别实例化SUser时不能弄错,即con的下标与各个构造方法的顺序得一致,否则报错:
//			java.lang.IllegalArgumentException: wrong number of arguments
		
		System.out.println(user);
		System.out.println(user2);
		System.out.println(user3);
		/*结果:
		用户名:admin,密码:null
		用户名:admin,密码:123456
		用户名:null,密码:null
		*/
	}catch(Exception e){
		e.printStackTrace();
	}
}

通过getConstructors方法获取SUser的所有构造方法,再根据参数情况和返回的构造方法数组的顺序依次进行实例化。如代码中所说,这里有一个注意的地方, 即:con的下标与各个构造方法的顺序得一致。

con数组的第一个构造方法为:public com.wjl.reflect.SUser(java.lang.String),即带一个参数的构造方法,那么newInstance时就必须使用con[0]的构造方法且带有一个参数,若是使用con[1](带2个参数)就必须带两个参数,否则就会报错。

自己拼接构造方法格式

public static void main(String[] args) {
	try{
		Class c = Class.forName("com.wjl.reflect.Person");
		Constructor<?> con[] = c.getConstructors();
		for(int i=0;i<con.length;i++){
			System.out.println("系统:"+con[i]);
			System.out.print("自定义:");
			getConstructorInfo(con[i]);
		}
	}catch(Exception e){
		e.printStackTrace();
	}
}

//自己拼接构造方法
public static void getConstructorInfo(Constructor con){
	System.out.print(Modifier.toString(con.getModifiers())+" ");//修饰符
	System.out.print(con.getName());//类名称
	System.out.print("(");
	//获取参数类型
	Class<?> p[] = con.getParameterTypes();
	for(int j=0;j<p.length;j++){
		System.out.print(p[j].getName());
		if(j<p.length-1){
			System.out.print(",");
		}
	}
	System.out.print(")"+"\n");
}
 

猜你喜欢

转载自1017401036.iteye.com/blog/2343705