黑马程序员技术交流社区
标题:
新手---关于反射
[打印本页]
作者:
李爱霞
时间:
2012-1-1 12:12
标题:
新手---关于反射
本帖最后由 李爱霞 于 2012-1-1 17:53 编辑
大家请给我分析一下代码:
public class ReflectTest6
{
public Object copyPerson(Object object) throws Exception
{
Class<?> classType=object.getClass();
//如果反射的类没有构造函数的时候
Object objectClass1=classType.newInstance();
//如果反射的类中重载的构造函数有参数的时候
Constructor<?> con=classType.getConstructor(new Class[]{});
Object bojectClass2=con.newInstance(new Object[]{});
//获得对象的所用成员变量
Field[] fields=classType.getDeclaredFields();
for(Field field:fields)
{
String name=field.getName();
String firstletter=name.substring(0,1).toUpperCase();
String getMethodName="get"+firstletter+name.substring(1,name.length());
String setMethodName="set"+firstletter+name.substring(1,name.length());
Method getMethod=classType.getMethod(getMethodName, new Class[]{});
Method setMethod=classType.getMethod(setMethodName, new Class[]{field.getType()});
Object value=getMethod.invoke(object, new Object[]{});-------这行代码不理解?
setMethod.invoke(objectClass1, new Object[]{value});------这行代码也不理解?他们之间有关系呀?
}
return objectClass1;
}
作者:
罗全涛
时间:
2012-1-1 15:09
本帖最后由 罗全涛 于 2012-1-1 15:12 编辑
一句一句看吧
public class ReflectTest6
{
public Object copyPerson(Object object) throws Exception
{
//通过对象的getClass()函数反射获得对应类的class实例对象,
Class<?> classType=object.getClass();
//调用class自带的newInstance函数获取传入对象的类的无参构造方法(内部实现),
//并通过这个无参构造方法获取传入对象的类的实例
Object objectClass1=classType.newInstance();
//此次调用class实例的getConstructor(new Class[]{})方法获取带参数的构造函数,
//与上面获取无参的相对应
Constructor<?> con=classType.getConstructor(new Class[]{});
//调用有参数的构造函数创建实例对象
Object bojectClass2=con.newInstance(new Object[]{});
//获得对象的所用以声明的成员变量:包括private的
Field[] fields=classType.getDeclaredFields();
//增强型for循环,进行遍历
for(Field field:fields)
{
//返回字段名称
String name=field.getName();
//截断字符串,并将其全部转成大写形式
String firstletter=name.substring(0,1).toUpperCase();
String getMethodName="get"+firstletter+name.substring(1,name.length());
String setMethodName="set"+firstletter+name.substring(1,name.length());
//通过发射获取成员方法,参数为方法名、参数数组,JDK1.6后参数数据变成可变参数
Method getMethod=classType.getMethod(getMethodName, new Class[]{});
//同上
Method setMethod=classType.getMethod(setMethodName, new Class[]{field.getType()});
//调用方法实例(对象)的方法,invoke翻译过来是调用,请求。参数为调用它的对象object, 、参数列表new Object[]{}
//参数列表new Object[]{}为Object类型,如果传入的是基本数据类型,会自动进行装箱操作,
Object value=getMethod.invoke(object, new Object[]{});
//同上
setMethod.invoke(objectClass1, new Object[]{value});
}
return objectClass1;
}
好了,希望对你理解上有用
作者:
李爱霞
时间:
2012-1-1 17:52
谢谢啦!!!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2