转载请注明出处:https://blog.csdn.net/jevonsCSDN/article/details/87824271 【Jevons’Blog】

依赖包:

commons-logging.jar

commons-beanutils-1.8.0-BETA.jar

cglib-nodep-3.2.10.jar

辅助包:

fastjson-1.1.39.jar


优化复制方法 2019-2-25 18:04:08

package dynamic;import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;import net.sf.cglib.beans.BeanGenerator;
import net.sf.cglib.beans.BeanMap;import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.BeanUtilsBean;import com.alibaba.fastjson.JSON;public class DynaBeanHolder {@SuppressWarnings("rawtypes")private Map classMap = new HashMap<String, Class<?>>();@SuppressWarnings("rawtypes")private Map valueMap = new HashMap<String, Object>();/** 创建标志 */private boolean isCreate = false;private BeanGenerator generator = null;private static BeanUtilsBean beanUtilsBean = BeanUtilsBean.getInstance();private Object dynaBean = null;private BeanMap beanMap = null;public DynaBeanHolder() {super();}/*** 初始化属性 class、key、value* * @param key* @param value* @return*/@SuppressWarnings("unchecked")private DynaBeanHolder initSet(String key, Object value) {if (this.dynaBean == null || !this.classMap.containsKey(key)) {this.classMap.put(key, value.getClass());this.valueMap.put(key, value);} else {beanMap.put(key, value);}return this;}/*** 初始化属性 class、key,同时值为null* * @param key* @param value* @return*/@SuppressWarnings("unchecked")public DynaBeanHolder setToNull(String key, Class<?> clazz) {if (this.dynaBean == null || !this.classMap.containsKey(key)) {this.classMap.put(key, clazz);this.valueMap.put(key, null);} else {beanMap.put(key, null);}return this;}/*** 给指定的dynaBean赋值* * @param dynaBean* @param key* @param value* @return*/public static Object set(Object dynaBean, String key, Object value) {BeanMap.create(dynaBean).put(key, value);return dynaBean;}/*** set方法* * @param key*            属性名* @param value*            值*/public DynaBeanHolder set(String key, Object value) {return initSet(key, value);}/*** get方法* * @param key*            属性名* @return 值*/public Object get(String key) {return beanMap.get(key);}/*** 获取bean(含有完整的属性 set/get方法)* * @return*/public Object getDynaBean() {return this.dynaBean;}/*** 结束属性初始化,创建并返回一个Object对象(内含相应属性的set/get方法)* * @return*/public DynaBeanHolder create() {if (!isCreate) {generator = new BeanGenerator();BeanGenerator.addProperties(generator, this.classMap);this.dynaBean = generator.create();this.beanMap = BeanMap.create(this.dynaBean);this.beanMap.putAll(this.valueMap);this.isCreate = true;}return this;}/*** 重建* * @return*/public DynaBeanHolder reCreate() {this.isCreate = false;return create();}/*** 销毁*/public void destroy() {this.classMap.clear();this.valueMap.clear();this.generator = null;this.dynaBean = null;this.beanMap = null;this.isCreate = false;}/*** 从dynaBean复制属性到target* * @param target* @throws IllegalAccessException* @throws InvocationTargetException*/public void copyTo(Object target) throws IllegalAccessException,InvocationTargetException {BeanUtils.copyProperties(target, this.dynaBean);}/*** 特殊复制:从dynaBean复制属性到target* * @param target* @param copyProperty* @throws Exception*/public void copySpecialTo(Object target, Collection<String> copyProperty)throws Exception {boolean specialCopy = copyProperty == null ? false : true;if (specialCopy) {for (Iterator it = copyProperty.iterator(); it.hasNext();) {String key = (String) it.next();BeanUtils.copyProperty(target, key,BeanUtils.getProperty(this.dynaBean, key));}} else {copyTo(target);}}/*** 从target复制属性到dynaBean* * @param src* @throws Exception*/public DynaBeanHolder copyFrom(Object src) throws Exception {return copyFrom(src, false);}public DynaBeanHolder copyFrom(Object src, boolean asNew) throws Exception {return copySpecialFrom(src, null, asNew);}/*** 从target复制属性到dynaBean* * @param src* @param asNew*            是否复制为一个新的DynaBeanHolder* @return* @throws Exception*/@SuppressWarnings("unchecked")public DynaBeanHolder copySpecialFrom(Object src,Collection<String> copyProperty, boolean asNew) throws Exception {boolean specialCopy = false;int copySize = 0;if (copyProperty != null) {specialCopy = true;copySize = copyProperty.size();}if (asNew) {DynaBeanHolder newHolder = newInstance();PropertyDescriptor[] descriptors = getPropertyDescriptor(src);for (PropertyDescriptor descriptor : descriptors) {if (!descriptor.getName().equals("class")&& ((specialCopy && copyProperty.contains(descriptor.getName())) || (!specialCopy))) {Class<?> clazz = descriptor.getPropertyType();String key = descriptor.getName();newHolder.classMap.put(key, clazz);newHolder.valueMap.put(key, descriptor.getReadMethod().invoke(src));if (specialCopy && --copySize == 0)break;// 阻断多余循环}}return newHolder.create();} else {if (this.dynaBean != null) {if (specialCopy) {PropertyDescriptor[] descriptors = getPropertyDescriptor(src);for (PropertyDescriptor descriptor : descriptors) {if (!descriptor.getName().equals("class")&& copyProperty.contains(descriptor.getName())) {String key = descriptor.getName();BeanUtils.copyProperty(this.dynaBean, key,BeanUtils.getProperty(src, key));if (--copySize == 0)break;}}} else {BeanUtils.copyProperties(this.dynaBean, src);}return this;} else {throw new Exception("Please initialize the dynaBean before calling the copyFrom!");}}}/*** 特殊复制属性 (只复制指定属性名的值) 静态* * @param src* @param copyProperty* @return* @throws Exception*/public static DynaBeanHolder copysSpecFrom(Object src,Collection<String> copyProperty) throws Exception {return newInstance().copySpecialFrom(src, copyProperty, true);}/*** 特殊复制属性 (只复制指定属性名的值) 静态* * @param src* @param copyProperty* @return* @throws Exception*/public static DynaBeanHolder copysSpecFrom(Object src,String... copyProperty) throws Exception {List<String> propertyList = null;if (copyProperty != null) {propertyList = Arrays.asList(copyProperty);} else {propertyList = Collections.emptyList();}return newInstance().copySpecialFrom(src, propertyList, true);}/*** 复制属性 (只复制指定属性名的值) 静态* * @param src* @param copyProperty* @return* @throws Exception*/public static DynaBeanHolder copysFrom(Object src) throws Exception {return newInstance().copyFrom(src, true);}/*** 获取属性 <br>* PropertyUtilsBean中已使用FastHashMap.setFast(true) <br>* 针对PropertyDescriptor做了缓存处理,不需要担心重复获取影响效率问题(线程安全)* * @param bean* @return*/public static PropertyDescriptor[] getPropertyDescriptor(Object bean) {return beanUtilsBean.getPropertyUtils().getPropertyDescriptors(bean);}public static DynaBeanHolder newInstance() {return new DynaBeanHolder();}/*** 特殊复制属性 (只复制指定属性名的值)* * @param src* @param copyProperty* @return* @throws Exception*/public DynaBeanHolder copySpecialFrom(Object src,Collection<String> copyProperty) throws Exception {return copySpecialFrom(src, copyProperty, false);}/*** 获取BeanMap* * @return*/public BeanMap getBeanMap() {if (this.beanMap == null && this.dynaBean != null) {this.beanMap = BeanMap.create(this.dynaBean);} else if (this.beanMap != null && this.dynaBean == null) {this.beanMap = null;}return this.beanMap;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((beanMap == null) ? 0 : beanMap.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;DynaBeanHolder other = (DynaBeanHolder) obj;if (beanMap == null) {if (other.beanMap != null)return false;} else if (!beanMap.equals(other.beanMap))return false;return true;}public static void main(String[] args) throws Exception {//测试样例:动态bean赋值给 user对象DynaBeanHolder bean = new DynaBeanHolder();Object object = bean.set("name","来了").set("age", 24).create();User user1 = new User();BeanUtils.copyProperties(user1, object);BeanUtils.copyProperties(user1, bean.getBeanMap());System.out.println(JSON.toJSON(object));System.out.println(JSON.toJSON(bean.set("fuck", "??").reCreate()));//测试样例:user对象赋值给 动态beanDynaBeanHolder bean2 = new DynaBeanHolder();Object object2 = bean2.setToNull("name", String.class).setToNull("age", Integer.class).create();User user2 = new User();user2.setAge(12);user2.setName("张三");bean2.copyFrom(user2);//正确赋值
//      BeanUtils.copyProperties(object2, user2);//正确赋值
//      BeanUtils.copyProperties(bean2.getBeanMap(),user2);//错误赋值
//      BeanUtils.copyProperties(bean2,user2);//错误赋值//测试样例:动态bean3 与 动态bean4比较DynaBeanHolder bean3 = new DynaBeanHolder();Object object3 = bean3.initSet("name","来了").initSet("age", 24).create();DynaBeanHolder bean4 = new DynaBeanHolder();Object object4 = bean4.initSet("name","来了").initSet("age", 24).create();System.out.println(object3.equals(object4));//falseSystem.out.println(object3==object4);//falseSystem.out.println(bean3.equals(bean4));//trueSystem.out.println(bean3==bean4);//falseSystem.out.println(bean3.getBeanMap().equals(bean4.getBeanMap()));//trueSystem.out.println(bean3.getBeanMap()==bean4.getBeanMap());//falseDynaBeanHolder bean5 = new DynaBeanHolder();bean5.copyFrom(user2,true);System.out.println(JSON.toJSON(bean5));}
}

实体测试类:

package dynamic;public class User {private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}}

DynaBeanHolder动态bean构造器实现相关推荐

  1. Spring Bean 是什么?

    本文内容如有错误.不足之处,欢迎技术爱好者们一同探讨,在本文下面讨论区留言,感谢. 文章目录 简述 Spring Bean 基础 定义Spring Bean BeanDefinition 元信息 命名 ...

  2. Java动态代理与Cglib库应用

    转载:http://blog.csdn.net/zhoudaxia/article/details/30591941 JDK动态代理 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的 ...

  3. 跟着柴毛毛学Spring(3)——简化Bean的配置

    通过前面的学习.我们会感觉到对于一个有较多Bean的大项目,Spring的配置会比較复杂. 那么接下来我们就介绍怎样简化Spring的配置. 简化Spring的配置主要分为两类: 1. 自己主动装配 ...

  4. 1.spring:helloword/注入/CDATA使用/其他Bean/null级联/p命名空间

    新建工程,导入jar,添加spring配置文件(配置文件xxxx.xml)! 1.Helloword实现 Helloword.java public class HelloWord {private ...

  5. 《Spring实战》第四版读书笔记 第二章 装配Bean

    2019独角兽企业重金招聘Python工程师标准>>> 在Spring中,对象无需自己查找或创建与其所关联的其他对象.相反,容器负责把需要相互协作的对象引用赋予各个对象. 创建应用对 ...

  6. 【Spring实战4】04---装配Bean(自动装配)

    主要内容: 声明Bean 构造器注入和Setter方法注入 装配Bean 控制bean的创建和销毁 Spring装配Bean的3种机制 在XML中进行显式配置 在Java中进行显式配置 隐式的bean ...

  7. 动态生成类_springboot动态生成类属性

    利用动态代理实现类中属性的动态生成. 使用场景:当不确定返回类中字段个数时,可使用动态生成属性个数实现需求.  注意:由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理. 引 ...

  8. Spring bean生命周期概览

    springBean的生命周期描述了交由spring管理的bean从创建,属性赋值,代理扩展,销毁的过程.在不同的阶段spring都提供了相应的接口提供扩展. Spring生命周期 各个接口与方法调用 ...

  9. BOM配置与产品构造器

    听很多人说起BOM Configuration和Product Builder之间的关系,有人问这两个东东是不是一回事?或者说哪个更高级?这两个东东我都玩过,在这里说一些自己认为的异同点,不见得对,还 ...

最新文章

  1. SQL SERVER数据库修改是否区分大小写
  2. C# 中的委托(Delegate)
  3. UNP Chapter 9 - 基本名字与地址转换
  4. fir滤波器c++程序_电气信息类专业课程之matlab系统仿真 第三章 滤波器的种类(1)...
  5. 自主学习 提问的智慧——学习中遇到难题怎么破?
  6. 最挑战程序员的9大任务,你都干过哪些?
  7. 鸿蒙公测第二期报名地址,鸿蒙2.0第二期公测报名入口及参加方法
  8. Linux系统(七)组管理和用户管理
  9. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_2_函数式接口的使用...
  10. [转]22条经典的编程引言
  11. 微信Android端如何安全降级
  12. 绝地反击 我的战胜贫困的经历01 转载 整理
  13. 李宏毅-人类语言处理-成分句法分析
  14. win7主机 ubuntu10.04虚拟机 共享文件夹设置
  15. C# XtraReport学习之三 绑定数据
  16. 【kettle】文件导入数据库乱码
  17. Keras深度学习实战(37)——手写文字识别
  18. CPU位数、操作系统位数和编译器位数关系
  19. 【数据挖掘】1、综述:背景、数据的特征、数据挖掘的六大应用方向、有趣的案例
  20. 波特率、比特、字、千字节、兆、G之间转换

热门文章

  1. supplier java8_Java 8之 Supplier示例
  2. Self-Organizing Map(自组织竞争型神经网络)
  3. impala java 堆内存配置_【原创】大叔问题定位分享(38)impala报错内存不足
  4. android 【禁止横屏和竖屏切换】
  5. 关于敏捷开发的一篇访谈录
  6. python合成心形_python如何绘制心形
  7. 分享100个ASP源代码总有一个是你想要的
  8. u盘启动计算机的几种方式,U盘启动那种模式最好?快试试这个方法!
  9. Saber吃苹果,保持每箱苹果数量递增
  10. 小明发布_LPL官方纪录片《来者何人》发布,比起FPX,RNG问题要严重多得多