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,一经查实,立即删除!

相关文章

Android中的Handler, Looper, MessageQueue和Thread

前几天,和同事探讨了一下Android中的消息机制,探究了消息的发送和接收过程以及与线程之间的关系。虽然我们经常使用这些基础的东西,但对于其内部原理的了解,能使我们更加容易、合理地架构系统,并避免一些低级错误。 对…

java平面_java知识点整理

一、http和tcp/ip的区别?http是应用层协议,主要解决如何封装数据。tcp/ip则是传输层协议,主要解决数据如何在网络中传递。web应用使用http协议作为应用层协议来封装成http文本协议,然后使用tcp/ip做传输层协议将信息发布到网络上。…

设计模式—适配器模式

一、概念 将一个类的接口转换成客户希望的另外一个接口。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…

EJB分布式对象实现方式描述

在Java RMI中要求所有的参数传递和返回类型是JAVA的基本类型或实现Serilizable的对象。串行化对象通过值传递(又名拷贝传递),而不是引用传递。这意味着在某一层中串行化对象的更新并不自动影响到其它的对象。 对于EJB对象而言,它由…

iis5.0+php5.0+mysql5.0配置完全手册_IIS5.0+PHP5.0+MySQL5.0配置完全手册

IIS5.0PHP5.0MySQL5.0配置完全手册环境:windows Xp sp2 IIS5.0 MySQL 5.0 PHP 5.0.4 使用PHPWind3.0论坛程序使用PHPmyadmin2.6.3适合初学者的配置1.首先是安装IIS5.0xp默认下是没有安装IIS的"控制面板"> "添加删除程序"> "添加\删除windows组件…

蓝桥杯java提交格式_2019第十届蓝桥杯JAVA省赛B组

B 不同子串题目描述一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成 的串。例如,字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共 7 个。 注意在计算时,只算本质不同的串的个数。请问,字符串0100110…

浅析Java与C#的事件处理机制(转)

Java与C#的事件处理都是实现了事件源-事件响应者机制,但又不完全相同。Java实现的是一种事件源与事件响应者两级实体对象方式,这里的事件响应者也是事件监听者,而C#实现的是一种事件源-代理-事件响应者三级实体对象方式。下面就这两种方式来具…

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

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

员工薪酬管理设计方案

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

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

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

null和undefined相等

<script language"javascript"><!-- var v0 1; // 定义一个值为1的变量 var v1 null; // 定义一个变量&#xff0c;并指定值为null var v2; // 定义一个变量…

java 文件inputstream_java – 如何在InputStream中接收多个文件并相应地处理它?

我想收到从客户端上传的多个文件.我上传了多个文件并使用JAX-RS(Jersey)请求我的服务器端(Java).我有以下代码,POSTConsumes(MediaType.MULTIPART_FORM_DATA)public void upload(Context UriInfo uriInfo,FormDataParam("file") final InputStream is,FormDataParam(…

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

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

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

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

Winform登录窗体登录仿asp.net验证成功后进入主界面

一、登录界面验证成功后进入主界面&#xff0c;否则则退出应用程序。 假设登录窗体frmLogin.cs和主界面frmMain.cs在程序的Main入口这样来实现&#xff1a; frmLogin login new frmLogin(); login.ShowDialog(); if (frmLogin.blCanLogin true) { Application.Run(new frm…

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

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

mysql数据库的变量有哪些_[数据库]MySQL变量

[数据库]MySQL变量0 2021-02-08 04:01:23原文链 id"mysql变量">MySQL变量MySQL变量分为系统变量和自定义变量系统变量系统变量有全局变量和会话变量查看系统变量#查看全局系统变量show global variables;#根据条件查询全局系统变量show global variables like %%;…