通过反射实例化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"); }