- 浏览: 1342665 次
- 性别:
- 来自: 湖南澧縣
-
文章分类
最新评论
-
虾米小尹:
不行啊!2.2-0.25=1.9500000000000002 ...
JavaScript浮点数运算 —— 精度问题 -
heluping000000:
引用String a= "abc",首先在 ...
String,到底创建了多少个对象? -
mack:
谢谢分享matcher.appendReplacement(s ...
string.replaceAll()中的特殊字符($ \)与matcher.appendReplacement -
wzt3309:
完全理解,比网上其他资料都要详细
String,到底创建了多少个对象? -
u014771876:
Java中十六进制转换 Integer.toHexString()
下面实例是一个实现了克隆与序列化一体的实体抽象DTO类,可供其类继承。只要继承了该类,子类就会自动具有克隆与序列化的特性,另外该抽象类重写了toString()方法,可以打印自身对象详细信息,子类不必要重写即可使用。
package comm.efin.dto; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.lang.reflect.AccessibleObject; import java.lang.reflect.Array; import java.lang.reflect.Field; import java.lang.reflect.Method; import comm.efin.CommException; import comm.efin.util.LogUtil; public abstract class AbstractDTO implements Serializable, Cloneable { /** * 日志记录器,不需要序列化,所以用transient修饰 */ private transient LogUtil log = LogUtil.getLogUtil(this.getClass()); /** * 注:自动的Serializable方法反序列化时不会调用默认构造函数 */ public AbstractDTO() { } /** * 应用反射机制重写克隆方法,这样子类不必要重写 clone方法就可以实现真真的克隆 * * @throws CloneNotSupportedException */ public Object clone() throws CloneNotSupportedException { Object cloneObj; try { // 首先调用父类(Object)的clone克隆对象 cloneObj = super.clone(); // 再克隆上面cloneObj对象里的所有引用属性 Field[] filedArr = this.getClass().getDeclaredFields(); AccessibleObject.setAccessible(filedArr, true); for (int i = 0; i < filedArr.length; i++) { // 如果该属性不能是基本类型,则要进行手工克隆,如果是基本类型数据, //则在该方法第一行就已复制,无需另外克隆 if (!filedArr[i].getType().isPrimitive()) { // 获取源对象属性值 Object filedVal = filedArr[i].get(this); // 如果对象属性实现了Cloneable接口 if (filedVal instanceof Cloneable) { // 用反射查找colone方法 Method cloneMethod = filedVal.getClass().getDeclaredMethod( "clone", new Class[] {});//clone方法无参数,所以传递一个空数组 // 调用对象属性clone方法,克隆相应的对象属性 Object cloneObject = cloneMethod.invoke(filedVal, null);//无参,传null即可 // 设置克隆出的对象到克隆对象中 filedArr[i].set(cloneObj, cloneObject); }// 如果被克隆的对象没有实现克隆方法时,直接实行浅拷贝 else { /* * 注:走该分支说明该属性对象没有实现Cloneable,如String、 Integer...之 * 类对象就没有实现克隆,因为这些类是final类且类的内容不可变,所以这一类的类 * 深拷贝也是没有意义。但要注意,如果是自己设计的类,就要考虑是否实现Cloneable * 与重写clone方法,如果没有这样作,也实行浅拷贝 */ filedArr[i].set(cloneObj, filedVal); } } } } catch (Exception e) { log.error("克隆失败.", e); throw new CloneNotSupportedException("克隆失败."); } return cloneObj; } /** * 应用序列化机制来实现深层克隆 这种实现起来简单,但比用clone方式效率低 * * @throws CommException * @throws IOException */ public AbstractDTO serialize() throws CommException { AbstractDTO cloneObj; try { // 开缓存 ByteArrayOutputStream bos = new ByteArrayOutputStream(); // 序列化操作对象 ObjectOutputStream oos; oos = new ObjectOutputStream(bos); // 序列化 oos.writeObject(this); // 从缓存中读取对象字节流 ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); // 反序列化操作对象 ObjectInputStream ois = new ObjectInputStream(bis); cloneObj = (AbstractDTO) ois.readObject(); } catch (Exception e) { log.error("序列化过程失败.", e); throw new CommException("序列化过程失败.", e); } return cloneObj; } /** * 通过实现Serializable方式序列化时,添加writeObject来达到可控操作序列化 * 在序列化时会调用此方法来实现序列化操作,自动序列化操作失效 * 供ObjectOutputStream.writeObject()调用 * * @param objectOutput * @throws IOException */ private void writeObject(ObjectOutputStream objectOutput) throws IOException { objectOutput.defaultWriteObject(); } /** * 在反序列化时会调用此方法来实现反序列化操作,自动反序列化操作失效 * 供ObjectInputStream.readObject()调用 * * @param objectInput * @throws IOException * @throws ClassNotFoundException */ private void readObject(ObjectInputStream objectInput) throws IOException, ClassNotFoundException { objectInput.defaultReadObject(); //在这里我们要为log对象进行初始化,因为LogUtil为被序列化,不然的话会为null log = LogUtil.getLogUtil(this.getClass()); } /** * 应用反射机制打印对象信息 * * @param obj * @return */ private String toString(Object obj) { // 如果是空 if (obj == null) { return "null"; } Class cl = obj.getClass(); // 如果是字符串直接返回 if (cl == String.class) { return (String) obj; } // 如果是数组 if (cl.isArray()) { String r = cl.getComponentType().getName().replaceAll("^.+\\.", "") + "[]{"; for (int i = 0; i < Array.getLength(obj); i++) { if (i > 0) { r += ", "; } Object val = Array.get(obj, i); // 如果数组里的元素为其本类型时 if (cl.getComponentType().isPrimitive()) { r += val; } else { // 否则递归枚举 r += toString(val); } } return r + "}"; } String r = cl.getName().replaceAll("^.+\\.", ""); r += "["; Field[] fields = cl.getDeclaredFields(); AccessibleObject.setAccessible(fields, true); // 获取对象的所有属性名及值 for (int i = 0; i < fields.length; i++) { Field f = fields[i]; if (!r.endsWith("[")) { r += ", "; } r += f.getName() + "="; try { Class t = f.getType(); Object val = f.get(obj); // 如果是其本类型直接连接 if (t.isPrimitive()) { r += val; } else { // 否则递归枚举 r += toString(val); } } catch (Exception e) { e.printStackTrace(); } } r += "]"; return r; } /** * 打印所有属性名及值 */ public String toString() { return this.toString(this); } /** * 清除DTO所有属性成员,使各属性值所对应的内存块清零 * * @param obj * @return */ public Object clear(Object obj) { try { Class cl = obj.getClass(); Field[] fields = cl.getDeclaredFields(); AccessibleObject.setAccessible(fields, true); for (int i = 0; i < fields.length; i++) { Field f = fields[i]; Class t = f.getType(); // 如果是基本类型设置成0 if (t.isPrimitive()) { f.set(obj, new Byte((byte) 0)); // 否则类对象全设置成null } else { f.set(obj, null); } } } catch (Exception e) { log.error(e); } return obj; } }
发表评论
-
Java正则表达式
2014-03-14 10:16 1784Java正则表达式详解 作者:jzj 文 ... -
类的初始化与清理
2013-06-24 22:20 1476初始化时内存清零 当创建一个对象时,首先将在堆上为这个对象分 ... -
protected,这个错了吗?
2013-06-24 22:17 1266这几天对protected修饰符有点迷糊,随便找同事要了一本 ... -
Java中BigDecimal的8种舍入模式
2013-06-21 18:42 2208java.math.BigDecimal不可变的、任意精度的 ... -
Tomcat性能参数设置
2010-12-27 15:35 34833默认参数不适合生产环境使用,因此需要修改一些参数 1、 ... -
Java 6 JVM参数选项大全
2010-12-14 11:16 1651http://kenwublog.com/docs/java6 ... -
对象的安全构造
2013-06-21 18:43 1563在构造期间,不要公布“this”引用 一种可以将数据争用引 ... -
Java断言(assert)—— 转
2010-06-20 10:36 12141一、概述 在C和C++语言中都有assert关键,表示断言。 ... -
eclipse调试
2010-06-04 00:11 8099eclipse远程调试 在eclipse3.4前,远程调试时 ... -
protected,你真的理解了吗?
2010-05-09 17:56 2165Java中的访问控制修饰符有四个级别,但属protected最 ... -
利用反射进行深层克隆
2010-05-05 21:02 3688最近在看《effective java ... -
类与类之间的几种关系
2010-05-03 13:49 2434类和类、类和接口、接 ... -
运行java
2010-05-03 13:47 1063用javac命令编译一个打包的类时,如果没有加参数" ... -
Java内存模型与volatile
2010-04-25 13:21 19017内存模型描述的是程序 ... -
中断线程
2010-04-24 21:19 9029中断线程 线程的thread.i ... -
java中的关键字、保留字、标示符
2010-04-07 23:48 3390关键字 Java的关键字对java的编译器有特殊的意义, ... -
Java中的浮点数剖析
2010-04-07 23:27 4755定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固 ... -
线程间的同步与互斥
2010-03-23 21:29 2317线程间的同步(实指线程间的通信):一般来说,一个线程相对于另 ... -
UTF-16、UTF-16BE、UTF-16LE编码方式的区别
2010-03-23 21:20 9893import java.io.IOException; ... -
final、finally、finalize
2010-01-22 01:15 2451final关键字 先看看final关键字,它可以被用于以下几个 ...
相关推荐
c语言学习
人脸识别项目源码实战
人脸识别项目源码实战
本图书进销存管理系统管理员功能有个人中心,用户管理,图书类型管理,进货订单管理,商品退货管理,批销订单管理,图书信息管理,客户信息管理,供应商管理,库存分析管理,收入金额管理,应收金额管理,我的收藏管理。 用户功能有个人中心,图书类型管理,进货订单管理,商品退货管理,批销订单管理,图书信息管理,客户信息管理,供应商管理,库存分析管理,收入金额管理,应收金额管理。因而具有一定的实用性。 本站是一个B/S模式系统,采用Spring Boot框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得图书进销存管理系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中解脱出来,实现无纸化办公,能够有效的提高图书进销存管理系统管理效率。 关键词:图书进销存管理系统;Spring Boot框架;MYSQL数据库
基于动态规划和模型预测控制的并联混合电动汽车最佳控制 简介:利用动态规划,使用模型预测控制,实现对并联混合动力电动汽车的最佳控制,并降低总体成本函数 使用动态规划可以实现混合动力电动汽车的优化控制 混合动力电动汽车的模型预测控制是通过使用动态规划在缩短的时域内实现的 代码为纯matlab脚本,附带说明电子文档 ,并联混合电动汽车; 动态规划; 模型预测控制; 最佳控制; 总体成本函数; Matlab脚本。,动态规划与模型预测控制在并联混合动力电动汽车的最优控制策略
人脸识别项目实战
2025 DeepSeek技术全景解析-重塑全球AI生态的中国力量.pdf
能够爬取非会员视频和音频资源,可通过ffmpeg等工具将视频资源和音频资源合并
基于差分进化算法DE的机器人路径规划 本产品基于优化的差分进化算法,专为机器人山地路径规划而设计 通过模拟差分进化过程中的变异、交叉与选择机制,算法能够智能探索并确定最优行进路线,全面考量路径长度、能量消耗及地形适应性 优化之处在于融合了动态差分权重与精英保留策略,显著增强了算法的搜索效率和求解质量,有效规避了早熟收敛的风险 该算法在山地这一复杂且多变的自然环境中展现出卓越性能,完美适配于机器人探险、山地救援、环境监测等多种应用场景 我们矢志为用户提供卓越、稳健的机器人路径规划方案,推动各类山地作业迈向更为精确与高效的路径规划新时代 ,差分进化算法DE; 机器人路径规划; 山地路径规划; 算法优化; 早熟收敛风险规避; 山地探险应用场景; 环境监测场景。,DE算法赋能机器人,优化山地路径规划方案
情侣游戏情侣飞行棋10元真心话大冒险情侣情趣骰子php源码 ----- 程序特色 ----- 1、完整的分销制度,可自定义多种不同的返佣比例 2、支持情侣飞行棋、情趣骰子,多种等级 3、无感微信自动授权登录,支持微信第三方授权登录 4、完全开源无加密
HeidiSQL的12.2.0.6576安装压缩包
监护人,小孩和玩具数据集 4647张原始图片 监护人 食物 孩子 玩具 精确率可达85.4% yolov5pytorch格式
本课程是 PHP 进阶系列之 Swoole 入门精讲,系统讲解 Swoole 在 PHP 高性能开发中的应用,涵盖 协程、异步编程、WebSocket、TCP/UDP 通信、任务投递、定时器等核心功能。通过理论解析和实战案例相结合,帮助开发者掌握 Swoole 的基本使用方法及其在高并发场景下的应用。 适用人群: 适合 有一定 PHP 基础的开发者、希望提升后端性能优化能力的工程师,以及 对高并发、异步编程感兴趣的学习者。 能学到什么: 掌握 Swoole 基础——理解 Swoole 的核心概念,如协程、异步编程、事件驱动等。 高并发处理——学习如何使用 Swoole 构建高并发的 Web 服务器、TCP/UDP 服务器。 实战项目经验——通过案例实践,掌握 Swoole 在 WebSocket、消息队列、微服务等场景的应用。 阅读建议: 建议先掌握 PHP 基础,了解 HTTP 服务器和并发处理相关概念。学习过程中,结合 官方文档和实际项目 进行实践,加深理解,逐步提升 Swoole 开发能力。
机器人先进视觉赛-基于深度学习yolov8的3D识别项目源码含gui界面(最新发布).zip 实现机器人的3D目标识别和分割功能 支持深度图像的处理和分析 【资源详情说明】 【1】该项目为近期精心打造开发,完整代码。同时,配套资料一应俱全,涵盖详细的设计文档 【2】项目上传前源码经过严格测试,在多种环境下均能稳定运行,功能完善且稳定运行,技术研究、教学演示还是项目实践,都能轻松复现,节省时间和精力。 【3】本项目面向计算机相关专业领域的各类人群,对于高校学生,可作为毕业设计、课程设计、日常作业的优质参考;对于科研工作者和行业从业者,可作为项目初期立项演示,助力快速搭建原型,验证思路。 【4】若具备一定技术基础,可在此代码上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 【5】小白,在配置环境或运行项目时遇到困难,可提供远程指导和全方位技术支持。 欢迎下载学习本项目资源,期待与你共同探讨技术问题,交流项目经验!
Matlab实现TSO-XGBoost多变量回归预测 Matlab实现TSO-XGBoost多变量回归预测,金枪鱼算法优化XGBoost多变量回归预测 1.data为数据集,7个输入特征,1个输出特征 2.MainTSO XGboost.m为主程序文件,其他为函数文件,无需运行 3.命令窗口输出R2、MAE、MAE和RMSEP等评价指标,可在下载区获取数据和程序内容 注意程序和数据放在一个文件夹,文件夹不可以XGBoost命名,因为有函数已经用过,运行环境为 Matlab2018及以上,预测效果如下 ,TSO-XGBoost; 多变量回归预测; Matlab实现; 金枪鱼算法优化; 评价指标; 预测效果; 文件夹结构; 运行环境,Matlab中TSO-XGBoost多变量回归预测优化实践
实时音视频SRT协议中文完整版
学习WiFi,入手资料
c语言学习
jl5104开发板的代码,sdk
二级建造师电子证照.ofd.zip