實現忽略大小寫的copyProperties


實現的原因

Spring中的BeanUtils.copyProperties(source,target),不能忽略大小寫,類型不同不能相互賦值。速度並不是特別理想。自己根據反射實現了工具類。 其中ReflectASM需要引入下面jar包

        <!---RelectAsm--> <dependency> <groupId>com.esotericsoftware</groupId> <artifactId>reflectasm</artifactId> <version>1.11.7</version> </dependency> 

#具體代碼

import com.esotericsoftware.reflectasm.MethodAccess; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.*; /** * * @Auther: xjw * @Description: 此類主要用於反射,對反射的一些操作進行緩存起來。 */ public class BeanUtils { /** * 集合 copy * * @param sources * @param target * @param <T> * @return */ public static <T> List<T> listCopyPropertiesASM(List sources, Class<T> target) { List list = new ArrayList<>(sources.size()); sources.forEach(it -> { list.add(copyPropertiesASM(it, target)); }); return list; } /** * 通過 target的Class 復制 * target 必須有一個無參構造器 * * @param source * @param target * @param <T> * @return */ public static <T> T copyPropertiesASM(Object source, Class<T> target) { T newT = null; try { newT = target.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return copyPropertiesASM(source, newT); } /** * 通過 ASM反射 速度比 Spring BeanUtils.copyProperties(source,target) 快一倍 * 大小寫可以忽略 * 下划線 _ 被忽略 * * @param source 源對象 * @param target 目標實例化對象 * @param <T> * @return */ public static <T> T copyPropertiesASM(Object source, Object target) { MethodAccess sourceMethodAccess = CacheMethodAccess.getMethodAccess(source.getClass()); MethodAccess targetMethodAccess = CacheMethodAccess.getMethodAccess(target.getClass()); Map<String, String> sourceGet = CacheAsmFiledMethod.getMethod("get", source.getClass()); Map<String, String> targetSet = CacheAsmFiledMethod.getMethod("set", target.getClass()); CacheFieldMap.getFieldMap(target.getClass()).keySet().forEach((it) -> { String sourceIndex = sourceGet.get(it); if (sourceIndex != null) { Object value = sourceMethodAccess.invoke(source, sourceIndex); String setIndex = targetSet.get(it); targetMethodAccess.invoke(target, setIndex, value); } }); return (T) target; } /** * 模仿Spring中 BeanUtils.copyProperties(source,target) * 大小寫可以忽略 * 下划線 _ 被忽略 * * @param source * @param target * @param <T> * @return */ public static <T> T copyProperties(Object source, Object target) { Map<String, Field> sourceMap = CacheFieldMap.getFieldMap(source.getClass()); CacheFieldMap.getFieldMap(target.getClass()).values().forEach((it) -> { Field field = sourceMap.get(it.getName().toLowerCase().replace("_", "")); if (field != null) { it.setAccessible(true); field.setAccessible(true); try { it.set(target, field.get(source)); } catch (IllegalAccessException e) { e.printStackTrace(); } } }); return (T) target; } private static class CacheAsmFiledMethod { private static Map<String, Map<String, String>> cacheGetMethod = new HashMap<>(); private static Map<String, Map<String, String>> cacheSetMethod = new HashMap<>(); private static Map<String, String> getMethod(String type, Class clazz) { MethodAccess methodAccess = CacheMethodAccess.getMethodAccess(clazz); Map<String, Field> allFields = CacheFieldMap.getFieldMap(clazz); Map<String, String> result = null; if (type.equals("get")) { result = cacheGetMethod.get(clazz.getName()); } else if (type.equals("set")) { result = cacheSetMethod.get(clazz.getName()); } if (result == null) { synchronized (CacheAsmFiledMethod.class) { if (result == null) { Map<String, String> set = new HashMap<>(); Map<String, String> get = new HashMap<>(); allFields.values().forEach((it) -> { //判斷是否是靜態 if (!Modifier.isStatic(it.getModifiers())) { //首字母大寫 char[] f = it.getName().toCharArray(); f[0] -= 32; String fieldName = new String(f); get.put(fieldName.toLowerCase().replace("_", ""), "get" + fieldName); set.put(fieldName.toLowerCase().replace("_", ""), "set" + fieldName); } }); cacheGetMethod.put(clazz.getName(), get); cacheSetMethod.put(clazz.getName(), set); if (type.equals("get")) { result = cacheGetMethod.get(clazz.getName()); } else if (type.equals("set")) { result = cacheSetMethod.get(clazz.getName()); } } } } return result; } } private static class SingelClass { private static Map<String, Object> cacheObject = new HashMap<>(); private SingelClass() { } private static <T> T getObject(Class<T> clazz) { T result = (T) cacheObject.get(clazz.getName()); if (result == null) { synchronized (SingelClass.class) { if (result == null) { try { cacheObject.put(clazz.getName(), clazz.newInstance()); result = (T) cacheObject.get(clazz.getName()); } catch (Exception e) { e.printStackTrace(); } } } } return result; } } private static class CacheMethodAccess { private CacheMethodAccess() { } private static Map<String, MethodAccess> cache = new HashMap<>(); private static MethodAccess getMethodAccess(Class clazz) { MethodAccess result = cache.get(clazz.getName()); if (result == null) { synchronized (CacheMethodAccess.class) { if (result == null) { cache.put(clazz.getName(), MethodAccess.get(clazz)); result = cache.get(clazz.getName()); } } } return result; } } private static class CacheFieldMap { private static Map<String, Map<String, Field>> cacheMap = new HashMap<>(); private static Map<String, Field> getFieldMap(Class clazz) { Map<String, Field> result = cacheMap.get(clazz.getName()); if (result == null) { synchronized (CacheFieldMap.class) { if (result == null) { Map<String, Field> fieldMap = new HashMap<>(); for (Field field : clazz.getDeclaredFields()) { fieldMap.put(field.getName().toLowerCase().replace("_", ""), field); } cacheMap.put(clazz.getName(), fieldMap); result = cacheMap.get(clazz.getName()); } } } return result; } } } 

測試

    public static void main(String[] args) { Man man = new Man("name", 20); Woman woman = BeanUtils.copyPropertiesASM(man, Woman.class); System.out.println(woman); List<Man> manList = new ArrayList<>(); for (int i = 0; i < 100; i++) { manList.add(new Man("name" + i, i)); } List<Woman> womens = BeanUtils.listCopyPropertiesASM(manList,Woman.class); System.out.println(womens); } 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM