Bean熟悉替换,只替换部分属性,其他属性值不改变

需要加入:asm.jar  cglib-2.1.jar,用来map和bean之间的转换(比spring和反射的效率好,因为加入了缓存)

package com.bean.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.cglib.beans.BeanMap;

public class CopyBean {

    /**
     * @param args
     */
    public static void main(String[] args) {

        User u1 = new User();
        u1.setId(1);
        u1.setName("用户1");
        u1.setPwd("12333");
        u1.setAddress("杭州西湖区");
        GirlFriend girl11 = new GirlFriend("范冰冰");
        GirlFriend girl12 = new GirlFriend("林心如");
        List<GirlFriend> list1 = new ArrayList<GirlFriend>();
        list1.add(girl11);
        list1.add(girl12);
        u1.setGirls(list1);

        User u2 = new User();
        u2.setName("【用户222】");
        u2.setAddress("【-甘肃省兰州市-】");
        GirlFriend girl21 = new GirlFriend("【赵雅芝】");
        GirlFriend girl22 = new GirlFriend("【张柏芝】");
        GirlFriend girl32 = new GirlFriend("【汤唯】");
        List<GirlFriend> list2 = new ArrayList<GirlFriend>();
        list2.add(girl21);
        list2.add(girl22);
        list2.add(girl32);
        u2.setGirls(list2);

        copyBean(u1, u2);
        System.out.println("拷贝后:"+u1);
    }

    /**
     * 将对象中需要改变的属性值 拷贝到目标对象中,替换目标对象中的部分属性值
     * 注意:2个传入的object必须类型相同
     * @param change 要改变的对象
     * @param target 目标对象
     */
    public static void copyBean(Object change, Object target) {
        Map<String, Object> toMap = beanToMap(change);
        Map<String, Object> fromMap = beanToMap(target);
        System.out.println("from:"+fromMap);
        System.out.println("to:"+toMap);

        for(String key : fromMap.keySet()){
            if(fromMap.get(key) == null){
                continue;
            }
            //将fromMap的值设置到toMap中
            toMap.put(key, fromMap.get(key));
        }
        //转换map为bean
        mapToBean(toMap, change);
    }

    /**
     * 将对象装换为map
     * @param bean
     * @return
     */
    public static Map<String, Object> beanToMap(Object bean) {
        Map<String, Object> map = new HashMap<String, Object>();
        if (bean != null) {
            BeanMap beanMap = BeanMap.create(bean);
            for (Object key : beanMap.keySet()) {
                map.put(key+"", beanMap.get(key));
            }
        }
        return map;
    }

    /**
     * 将map装换为javabean对象
     * @param map
     * @param bean
     * @return
     */
    public static void mapToBean(Map<String, Object> map,Object bean) {
        BeanMap beanMap = BeanMap.create(bean);
        beanMap.putAll(map);
    } 

}
from:{id=0, girls=[GirlFriend [name=【赵雅芝】], GirlFriend [name=【张柏芝】], GirlFriend [name=【汤唯】]], pwd=null, address=【-甘肃省兰州市-】, name=【用户222】}

to:{id=1, girls=[GirlFriend [name=范冰冰], GirlFriend [name=林心如]], pwd=12333, address=杭州西湖区, name=用户1}

拷贝后:User [编号=1, 姓名=【用户222】, 密码=12333, 地址=【-甘肃省兰州市-】, 女朋友=[GirlFriend [name=【赵雅芝】], GirlFriend [name=【张柏芝】], GirlFriend [name=【汤唯】]]]
时间: 2024-11-10 11:22:23

Bean熟悉替换,只替换部分属性,其他属性值不改变的相关文章

关键字替换排除HTML标签属性字符

解决办法: 1.打开文件e/class/functions.php 2.找到函数 ReplaceKey($newstext,$classid=0) 3.找到替换代码 if(STR_IREPLACE) { $newstext=empty($public_r[repkeynum])?str_ireplace($r[keyname],'<a href='.$r[keyurl].' target=_blank class=infotextkey>'.$r[keyname].'</a>',$

js替换img标签src属性,并为非微信内核浏览器添加超链接

/** * 替换img标签src属性 * @param content * @param path */ function imgsSrc(content, path) { var imgreg = /<img.*?>/gi; content=content.replace(imgreg,function(imgsrc){ imgsrc = imgsrc.replace(/src=(?:"\s*([^"]*)\s*"|'\s*([^']*)\s*'|(\S+))/

3.springboot:springboot配置文件(配置文件、YAML、属性文件值注入&lt;@Value、@ConfigurationProperties、@PropertySource,@ImportResource、@Bean&gt;)

1.配置文件: springboot默认使用一个全局配置文件 配置文件名是固定的 配置文件有两种(开头均是application,主要是文件的后缀): ->application.properties ->application.yml 作用:修改springboot自动配置的默认值 springboot在底层把一切都自动配好 位置: 配置文件放在src/main/resourcr目录或者 类路径/config 下 2.YAML: YAML(YAML Ain't Markup Language

线段树经典操作模板(单点更新,替换;区间更新,替换;区间求和求最值)

对于线段树的讲解此篇不再赘述,下面列出线段树应用中最常用的几种操作的代码.(具体题目未贴出,仅供有一定基础者参考代码风格) 另外,注意多组输入要写scanf("%d%d",&n,&m)!=EOF,线段树的题肯定要用c语言的输入输出,要使用字符数组,不用字符串,输入字符的时候要加getchar()吞噬空行.. (1)单点增减,区间求和: #include<iostream> #include<stdio.h> #include<string&

Spring - bean的依赖关系(depends-on属性)

depends-on是bean标签的属性之一,表示一个bean对其他bean的依赖关系.乍一想,不是有ref吗?其实还是有区别的,<ref/>标签是一个bean对其他bean的引用,而depends-on属性只是表明依赖关系(不一定会引用),这个依赖关系决定了被依赖的bean必定会在依赖bean之前被实例化,反过来,容器关闭时,依赖bean会在被依赖的bean之前被销毁. 示例如下: <bean id="beanOne" class="ExampleBean

13 三种方式替换SQL Server中的NULL值(Different ways to replace NULL in Sql Server)

在Sql Server中有三种方式对查询结果中的NULL值进行替换. 如有下面的一张表: 我们可以通过自连接(Self-Join)的方式一张员工名和其对应的经理名的表: SELECT E.[Name],M.[Name] FROM [tblEmployee] AS E LEFT JOIN [tblEmployee] AS M ON E.ManagerId = M.EmployeeId 我们可以看到,Todd对应的Manger为NULL,这说明Todd应该是公司的最高层,他没有经理.但是这样显示很不

word中替换被批注的正文的值

word中替换被批注的正文的值 word批注winform替换值正文             try            {                Word.Document document = (Word.Document)dsoWord.ActiveDocument;                foreach (Word.Comment var in document.Comments)                {                    var.Scop

.net中如何实现json转化时只处理部分属性二?

在第一篇文章中使用的json方法,可以按照需要只处理需要的属性,但却要求属性不能是复杂的类型,例如泛型,数组,其他用户自定义的类等,限制太多,于是自己看看能不能改进,想不到Newtonsoft.Json提供有相关的接口,只需要实现就可以了.只需要继承DefaultContractResolver,并改写一个方法就可以了. 核心代码: /// <summary> /// 对象转为json,所有属性都输出 /// </summary> /// <typeparam name=&q

Spring实战(八)bean装配的运行时值注入——属性占位符和SpEL

前面涉及到依赖注入,我们一般哦都是将一个bean引用注入到另一个bean 的属性or构造器参数or Setter参数,即将为一个对象与另一个对象进行关联. bean装配的另一个方面是指将一个值注入到bean的属性or构造器参数中,通常我们可以将值硬编码在配置类中,XML中也是硬编码(写出所有值). 1.若想避免硬编码,让这些值在运行时再确定,Spring提供了两种在运行时求值的方式. 属性占位符(Property placeholder)--Spring支持将属性定义到外部的属性文件中,然后用占