java深度克隆大数据_Java - 深拷贝技巧

先让我描述一下问题:

我在某Action(struts2.x)-A中写了一个功能P,以当前用户的某个标识F == 1时需要走这个功能,而且这个功能因某些原因已经侵入到了其他一些method中。

顺便一提,A中获得当前用户session的method已经被父类封装好了。

然后我的代码已经push上去了,第二天有人告诉我能不能暂时去掉这个功能。

一个个注释掉太麻烦了,

于是我决定在这个A中override获得当前用户session的method,并将F赋值为0。

于是我只需要来个shallow copy就可以了。

比如我可以这样:

给User来个implements Clonable

然后在getUserInfo()的Override中clone一个出来再赋值setF(0)

但这也许不太好,毕竟我需要动User。

我可以直接使用org.springframework.beans.BeanUtils.copyPropergties(source,target)

看了看源码,里面又是sourcepd又是targetpd,pd是什么?

eefac1fc94383f830a7e0313fd3bbb1c.png

就当他是用来描述java bean的媒介好了。

当然,他也是shallow copy...

for (PropertyDescriptor targetPd : targetPds) {

if (targetPd.getWriteMethod() != null &&

(ignoreProperties == null || (!ignoreList.contains(targetPd.getName())))) {

PropertyDescriptor sourcePd = getPropertyDescriptor(source.getClass(), targetPd.getName());

if (sourcePd != null && sourcePd.getReadMethod() != null) {

try {

Method readMethod = sourcePd.getReadMethod();

if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {

readMethod.setAccessible(true);

}

Object value = readMethod.invoke(source);

Method writeMethod = targetPd.getWriteMethod();

if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {

writeMethod.setAccessible(true);

}

writeMethod.invoke(target, value);

} catch (Throwable ex) {

throw new FatalBeanException("Could not copy properties from source to target", ex);

}

}

}

}

无论如何,这个已经解决我的问题了,A中调用getUserInfo()都是我clone的User,不会影响其他的Action.

但如果我那天用User下某个引用类型的Field的某个simple type的Field做标记呢?

那我得deep clone,平时掌握的类库不多,让我自己解决的话我怎么弄?

也许我可以这样做:

File f = new File("@#$%^&*");

f.createNewFile();

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f));

oos.writeObject(u0);

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f));

u1 = (User)ois.readObject();

光看一小段代码感觉是个简单粗暴的好办法,只不过我得User及其下那些引用类型加上implements Serializable...

后来我找到了这样一个东西:

uk.com.robust-it

cloning

1.9.0

可以这样使用:

com.rits.cloning.Cloner cloner = new com.rits.cloning.Cloner();

u1 = cloner.deepClone(u0);

u1.getPet().setName("papapa");

System.out.println(u0);

System.out.println(u1);

输出结果是clone后的u1的pet的名字变成了papapa而作为clone source的u0没有任何变化,这就是deep clone.

忽略clone source是数组的情况,这个类进行deep clone的关键部分如下:

for (final Field field : fields) {

final int modifiers = field.getModifiers();

if (!Modifier.isStatic(modifiers)) {

if (nullTransient && Modifier.isTransient(modifiers)) {

// request by Jonathan : transient fields can be null-ed

final Class> type = field.getType();

if (!type.isPrimitive()) {

field.set(newInstance, null);

}

} else {

final Object fieldObject = field.get(o);

final boolean shouldClone = (cloneSynthetics || (!cloneSynthetics && !field.isSynthetic())) && (cloneAnonymousParent || ((!cloneAnonymou        sParent && !isAnonymousParent(field))));

final Object fieldObjectClone = clones != null ? (shouldClone ? cloneInternal(fieldObject, clones) : fieldObject) : fieldObject;

field.set(newInstance, fieldObjectClone);

if (dumpClonedClasses && fieldObjectClone != fieldObject) {

System.out.println("cloned field>" + field + " -- of class " + o.getClass());

}

}

}

}

递归下去找field的引用的引用的引用的引用....然后全是他们newInstance...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式—适配器模式

一、概念 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。——Gang of Four Adapter模式的宗旨:保留现有类所提供的服务,向客户提供接口,以满足客户的期望。 对象适配…

android UI进阶之实现listview的分页加载

上篇博文和大家分享了下拉刷新,这是一个用户体验非常好的操作方式。新浪微薄就是使用这种方式的典型。 还有个问题,当用户从网络上读取微薄的时候,如果一下子全部加载用户未读的微薄这将耗费比较长的时间,造成不好的用户体验&…

java stringutils_Java 笔记----- StringUtils 拼接字符

import org.apache.commons.lang3.StringUtils;StringUtils 提供了 join 方法用来 按照自定义的拼接符拼接join实现源码:感兴趣的可以看看public static String join(Iterator> iterator, String separator) {// handle null, zero and one elements before buil…

java xml接口实例化_Spring简介及xml配置

Java Web发展史第一阶段:JavaBeanServletJsp逐步发展第二阶段:面对EJB重量级框架带来的种种麻烦第三阶段:SpringMVC/StrutsSpringHibernate/myBatis第四阶段:享受SpringBoot"约定大于配置"的种种乐趣,很多繁琐的配置都变成了约定第五阶段:以Dubbo为代表的…

员工薪酬管理设计方案

待遇管理模块目前我遇到的要分两种方案,第一种是集团版的(有子公司、区域公司);第二种是标准版的(就是一个标准的公司,不存在什么子公司),下面就谈谈标准版个人是如何处理的。 特别感谢:江琴童鞋、罗静童鞋两位财务人员…

文件上传简介1---上传到指定的目录

preparation 本节摘要:本节主要介绍上传文件到指定目录。 引入: 文件上传是开发中常用的功能,本节主要介绍用commons-fileupload-1.1.jar包实现基本的文件上传功能,即上传文件到指定的目录中,同时介绍上传过程中使用到…

java驱动pl sql优点_用PL/SQL和Java开发Oracle8i应用程序

用PL/SQL和Java开发Oracle8 i应用程序随着Oracle8i的发布,Oracle 在数据库里支持了二种主要的编程语言??PL/SQL和Java。今天,Oracle的许多客户既使用PL/SQL建立数据库应用程序,也使用Java建立数据库应用程序。既然存在二种数据库编程语言&a…

java客户姓名添加和查找_java类与对象 演练 客户姓名添加与查看

java类与对象 演练 客户姓名添加与查看java类与对象 演练 客户姓名添加与查看https://www.ixigua.com/6870483106223096327?logTag_YUmIb2rn9-6JpoNipj9r属性由于需要保存很多名字因此来一个字符串的数组保存字符串的名字即可考虑,定义多个长度的数组,例…

应用程序调试技术(更新程度:完毕)送源码及PPT

课程简介 调试技术实务分为调试基本概念和设置,Windows下常用到调试工具VS和Windbg的使用,自动化调试技术,以及实际调试场景示例等。不仅仅是介绍枯燥的程序调试技术,而是深入的从操作系统实现以及.NET虚拟机实现的本质出发&#…

安装ie浏览器的js脚本调试工具

在ie中,如果不依赖外部工具进行js调试,而使用原始的alert的话,会大大增加js调试的难度。而微软的office、visual studio里边都带了可以支持ie调试的工具。 在安装office(2003、2007带此工具,2010不带此工具)时,选择自定…

领域驱动设计和开发实战总结

原文见:http://www.infoq.com/cn/articles/ddd-in-practice 转载于:https://www.cnblogs.com/ego/archive/2012/03/03/2378104.html

linux php 上级目录,Linux目录架构详解_php

linux和Windows操作系统的显著区别之一就是目录架构的不同。Linux操作系统的目录架构遵循文件系统层级结构标准。不知你是否使用ls命令浏览过Linux的根目录“/”,亲爱的读者,您都了解这些目录的含义吗?ls -l / 遍历文件系统(点击看大图)本文将引领您浏览…

screen执行php,Linux中screen命令及使用方法

Screen简介Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。GUN Screen&am…

数据库字符串处理函数

在数据库操作中,经常要进行字符串的拼接和替换等操作。下面总结归纳如下: 示例数据表people如下: 1 sql server数据库中的sql语句可以直接用 号进行字符串的拼接。举例如下: select Name ‘ ’ gentle as message from people …

前端学习(417):京东制作页面25中间部分的准备工作

引入index.css作为中部样式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Comp…

前端学习(418):京东制作页面26中间模块划分

index.css /* 中间模块 */ .grid{height: 480px;} .grid-coll1{width: 190px;height: 100%;background-color: pink;} .grid-coll2{width: 790px;height: 100%;background-color: skyblue;margin-left:10px;} .grid-coll3{width: 190px;height: 100%;background-color:purple;…

前端学习(419):京东制作页面27左侧分类上

index.css /* 中间模块 */ .grid{height: 480px;} .grid-coll1{width: 190px;height: 100%;background-color: pink;} .grid-coll1 ul{padding: 20px 0;} .grid-coll1 ul li{padding-left: 12px;}.grid-coll2{width: 790px;height: 100%;background-color: skyblue;margin-lef…

UNP Chapter 22 - 信号驱动I/O

22.1. 概述 信号驱动是指当某个描述字上发生了某个事件时&#xff0c;让内核通知进程。 这里描述的信号驱动不是真正的异步I/O。 第15章描述的非阻塞I/O同样不是异步I/O。在非阻塞I/O中&#xff0c;启动I/O操作后内核并不像真正的异步I/O那样立即返回&#xff0c;它只有在进程非…

php strpos与strrpos,PHP开发之 strpos stripos strrpos strripos的区别

前言在日常PHP开发中strpos stripos strrpos strripos这四个函数是会经常用到的&#xff0c;但是你又掌握了多少呢&#xff1f;在这里将着中就这4个函数做一个详细的解析。正文stripos — 查找字符串首次出现的位置(不区分大小写),应使用 运算符来测试此函数的返回值&#xff…