BeanUtil 反射机制 拷贝对象类或list

本文介绍了一个名为BeanUtil的工具类,该类主要用于实现Java Bean之间的属性复制,包括单个Bean及列表的复制。BeanUtil提供了多种方法来处理不同场景下的Bean属性复制需求,并支持从Map到Bean的转换。

BeanUtil为拷贝类,list,map的工具类,类似BeansUtils



package com.gy.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.util.*;

/**
 * 此类为重写BeanUtils.copyProperties方法,其他包含List等情况,可以扩展重写
 *
 * @author chenhs
 * @version 20170728
 *
 */
public class BeanUtil {
    /**
     * @param target  目标类
     * @param source  原类
     * @param objects 对象集合
     */
    public static void copyProperties(Object target, Object source, Object... objects) {
        try {
            Class clazz1 = source.getClass();
            Class clazz2 = target.getClass();
            Field[] fields1 = clazz1.getDeclaredFields();
            Field[] fields2 = clazz2.getDeclaredFields();
            for (Field field1 : fields1) {
                String name1 = field1.getName();
                Method m = clazz1.getMethod("get" + toUpcase(name1));
                for (Field field2 : fields2) {
                    String name2 = field2.getName();
                    if (name1.equals(name2)) {
                        field2.setAccessible(true);
                        if (m.invoke(source) != null) {
                            field2.set(target, m.invoke(source));
                        }
                    }
                    //判断objects
                    if (objects.length > 0) {
                        HashMap<String, Object> paramMap = (HashMap<String, Object>) objects[0];
                        if (paramMap.get(name2) != null) {
                            field2.setAccessible(true);
                            field2.set(target, paramMap.get(name2));
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param target  目标类
     * @param map  原类
     */
    public static void copyMapProperties(Object target, Map<String,Object> map) {
        try {
            Class clazz2 = target.getClass();
            Field[] fields2 = clazz2.getDeclaredFields();
            for (String key : map.keySet()) {
                String name1 = key;
                Object value =(Object) map.get(key);
                for (Field field2 : fields2) {
                    String name2 = field2.getName();
                    if (name1.toUpperCase().equals(name2.toUpperCase())) {
                        field2.setAccessible(true);
                        if (value != null) {
                            field2.set(target, value);
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 如果某个参数为固定值,则可以加以下对象objects,如:
     * paramMap.put("userId", "aaaaaaaaaaa");
     * paramMap.put("num", 777777777);固定值
     *
     * @param list    源list
     * @param target  目标类CLASS
     * @param objects 对象集合
     * @return list
     */
    public static List<?> copyPropertiesList(List<?> list, Class target, Object... objects) {
        List<Object> result = new ArrayList();
        if (list != null) {
            for (Object o : list) {
                try {
                    Object d = target.newInstance();
                    copyProperties(d, o, objects);
                    result.add(d);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }

    /***
     * 此方法为jdbc中调用指生成结果的方法,其他类型可以继续添加....
     * *@author  chenhs
     * update wmk
     *
     * @param clazz      * @param rs    结果集合
     * @return object
     * @date 2015/11/19
     */
    public static Object getBeanForRs(Class clazz, ResultSet rs) {
        try {
            Object target = clazz.newInstance();
            Field[] fields = clazz.getDeclaredFields();
            for (Field field : fields) {
                String name = field.getName();
                field.setAccessible(true);
                Class type = field.getType();
                try {
                    if (type.equals(String.class)) {
                        field.set(target, rs.getString(name));
                    } else if (type.equals(Integer.class)) {
                        field.set(target, rs.getInt(name));
                    } else if (type.equals(Long.class)) {
                        field.set(target, rs.getLong(name));
                    } else if (type.equals(Float.class)) {
                        field.set(target, rs.getFloat(name));
                    } else if (type.equals(BigDecimal.class)) {
                        field.set(target, rs.getBigDecimal(name));
                    } else if(type.equals(UUID.class)){
                        field.set(target, UUID.fromString(rs.getString(name)));
                    } else if(type.equals(Date.class)){
                        field.set(target,rs.getDate(name));
                    }
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
            }
            return target;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 首字母转大写
     *
     * @param s 字符串
     * @return stirng
     * update wmk
     */
    private static String toUpcase(String s) {
        return s.substring(0, 1).toUpperCase() + s.substring(1, s.length());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

英雄汉孑

每一滴心意都是对知识分享的赞美

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值