A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李爱霞 黑马帝   /  2012-1-1 12:12  /  2132 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李爱霞 于 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;
              
     }   

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 罗全涛 于 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;
               
     }   
好了,希望对你理解上有用

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

回复 使用道具 举报
谢谢啦!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马