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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 雷丹 中级黑马   /  2013-10-24 10:51  /  1587 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天需要通过反射写一个类操作一个bean,据我以前的知识体系java中的Method类中的invoke方法的两个参数的意思为:第一个参数是具体调用该方法的对象,第二个参数是执行该方法的具体参数。所以带着自信一口气写完后发现输出的结果为空,最后我左改改,又查查就改成现在这个样子了,但是发现自己糊涂了,发现程序中两个invoke方法的第一个参数不同。在此希望各位大神帮忙看看,小弟感激不尽。疑问产生于程序代码的36-48行。

package org.cqut.java.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class CopyObject {

        public Object copyObject(Object object) throws Exception {

                // 1.获取待操作类的一个Class对象
                Class<?> classType = object.getClass();

                // 2.获取待操作类的一个实例
                Constructor<?> constructor = classType
                                .getConstructor(new Class<?>[] {});
                Object copyObj = constructor.newInstance(new Object[] {});

                // 3.获取被拷贝类的成员变量
                Field[] fields = classType.getDeclaredFields();

                for (Field field : fields) {
                        // 4.遍历数组获取各个成员变量名字
                        String name = field.getName();// 获取成员变量名字;

                        // 5.操作字符串获取成员变量的set和get方法名字;
                        String firstLetter = name.substring(0, 1).toUpperCase();
                        String getMethodName = "get" + firstLetter + name.substring(1);
                        String setMethodName = "set" + firstLetter + name.substring(1);

                        Method getMethod = classType.getMethod(getMethodName,
                                        new Class<?>[] {});
                        Method seMethod = classType.getMethod(setMethodName,
                                        new Class<?>[] { field.getType() });
                       
                        /*最开始认为以下两个invoke方法的第一和参数都应该调用copyObj,
                         * 但是最终的结果为输出为默认的空值。
                         * copyObj:程序前面通过Constructor类的newInstance方法
                         * 获取待操作类的一个实例;
                        //Object value = getMethod.invoke(copyObj, new Object[] {});
                        //seMethod.invoke(copyObj, new Object[] { value });

                        /*现在改用如下方式了,输出就正常了
                         * 所以产生疑惑:为什么第一个方法调用的object对象而不是copyObj呢?
                         *
                         */
                        Object value = getMethod.invoke(object, new Object[] {});
                        seMethod.invoke(copyObj, new Object[] { value });

                       
                }

                return copyObj;
        }

        public static void main(String[] args) throws Exception {

                Student student = new Student("Tom", 21);
                student.setId(111030805);
                CopyObject copy = new CopyObject();
                Student student2 = (Student) copy.copyObject(student);
                System.out.println(student2.getId() + " " + student2.getName() + " "
                                + student2.getAge());
        }
}

// 一个被反射的JavaBean
class Student {

        private long id;
        private String name;
        private int age;

        public Student() {

        }

        public Student(String name, int age) {
                this.name = name;
                this.age = age;
        }

        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }

        public int getAge() {
                return age;
        }

        public void setAge(int age) {
                this.age = age;
        }

        public long getId() {
                return id;
        }

        public void setId(long id) {
                this.id = id;
        }

}

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 很给力!

查看全部评分

1 个回复

倒序浏览
Object value = getMethod.invoke(object, new Object[] {});
getMethod方法是Object对象(类型),并不能真对获取具体的(对象)类型。
seMethod.invoke(copyObj, new Object[] { value });
而seMethod可以对具体对象设值

评分

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

查看全部评分

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