黑马程序员技术交流社区

标题: 新手---关于反射 [打印本页]

作者: 李爱霞    时间: 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