我是靠谱客的博主 欢呼芹菜,最近开发中收集的这篇文章主要介绍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");
}
 

最后

以上就是欢呼芹菜为你收集整理的java反射机制学习(二):通过反射获取构造方法并实例化对象的全部内容,希望文章能够帮你解决java反射机制学习(二):通过反射获取构造方法并实例化对象所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部