1. 程式人生 > >BeanUtil 反射機制 拷貝物件類或list

BeanUtil 反射機制 拷貝物件類或list

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()); } }