反射机制处理历程

package com.mipo;

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

public class ReflectTester {

    /**
     * 该方法实现对Customer对象的拷贝操作
     *
     * @param object
     * @return
     * @throws Exception
     */
    public Object copy(Object object) throws Exception {
        Class<?> classType = object.getClass();

        /*
         * 生成新的对象的讨论 
         * 1.1 获得Constructor对象,此处获取第一个无参数的构造方法的 
         * Constructor cons = classType.getConstructor(new Class[] {});
         * 
         * 1.2 不带参数,所以传入一个为空的数组,通过构造方法来生成一个对象
         * Object obj = cons.newInstance(new Object[] {});
         * 
         * 以上两行代码等价于如下代码,但这行代码无法处理构造函数有参数的情况:
         * Object obj11 = classType.newInstance();
         * 
         * 
         * 2 用第二个带参数的构造方法生成对象
         * Constructor cons2 = classType.getConstructor(new Class[] {String.class, int.class});
         * Object obj2 = cons2.newInstance(new Object[] {"ZhangSan", 20});
         * 
         */

        Object target = classType.getConstructor(new Class[] {}).newInstance(new Object[] {});

        // 获得对象的所有成员变量
        Field[] fields = classType.getDeclaredFields();
        for (Field field : fields) {
            // 获取成员变量的名字
            String name = field.getName();
            // System.out.println(name);

            // 获取get和set方法的名字
            String firstLetter = name.substring(0, 1).toUpperCase(); // 将属性的首字母转换为大写
            String getMethodName = "get" + firstLetter + name.substring(1);
            String setMethodName = "set" + firstLetter + name.substring(1);
            // System.out.println(getMethodName + "," + setMethodName);

            // 获取方法对象
            Method getMethod = classType.getMethod(getMethodName, new Class[] {});
            Method setMethod = classType.getMethod(setMethodName, new Class[] { field.getType() });// 注意set方法需要传入参数类型

            // 调用get方法获取旧的对象的值
            Object value = getMethod.invoke(object, new Object[] {});
            // 调用set方法将这个值复制到新的对象中去
            setMethod.invoke(target, new Object[] { value });

        }

        return target;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值