java复制对象属性:只复制需要的属性值,目标对象中原来的值不变(反射)详解编程语言

使用反射(性能很差,自测是cglib-beanmap性能的50分之1左右):

/** 
     * 复制对象属性:只复制需要的属性值,目标对象中原来的值不变 
     * 只适用于2个相同对象 
     * @param from 要复制的对象 
     * @param to 目标对象 
     * @throws Exception 
     */ 
    @SuppressWarnings("unchecked") 
    public static void copyPropertiesExclude(Object from, Object to) throws Exception { 
        if(!from.getClass().equals(to.getClass())){ 
            throw new RuntimeException("对象不是同一类型,fromClass:"+from.getClass()+",toClass:"+to.getClass()); 
        } 
        Method[] fromMethods = from.getClass().getDeclaredMethods(); 
        Method[] toMethods = to.getClass().getDeclaredMethods(); 
        Method fromMethod = null, toMethod = null; 
        String fromMethodName = null, toMethodName = null; 
        for (int i = 0; i < fromMethods.length; i++) { 
            fromMethod = fromMethods[i]; 
            fromMethodName = fromMethod.getName(); 
            if (!fromMethodName.contains("get")) { 
                continue; 
            } 
            toMethodName = "set" + fromMethodName.substring(3); 
            toMethod = findMethodByName(toMethods, toMethodName); 
            //如果方法为null,不处理 
            if (toMethod == null) { 
                continue; 
            } 
            Object value = fromMethod.invoke(from, new Object[0]); 
            //如果值为空,不处理 
            if(value == null) { 
                continue; 
            } 
            //集合类判空处理 
            if(value instanceof Collection) { 
                Collection newValue = (Collection)value; 
                if(newValue.size() <= 0) 
                    continue; 
            } 
            toMethod.invoke(to, new Object[] {value}); 
        } 
    } 
 
    /** 
     * 从方法数组中获取指定名称的方法 
     * 
     * @param methods 
     * @param name 
     * @return 
     */ 
    public static Method findMethodByName(Method[] methods, String name) { 
        for (int j = 0; j < methods.length; j++) { 
            if (methods[j].getName().equals(name)) 
                return methods[j]; 
        } 
        return null; 
    }

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/16967.html

(0)
上一篇 2021年7月19日 19:46
下一篇 2021年7月19日 19:46

相关推荐

发表回复

登录后才能评论