- 浏览: 1324802 次
- 性别:
- 来自: 湖南澧縣
文章分类
最新评论
-
虾米小尹:
不行啊!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 1710Java正则表达式详解 作者:jzj 文 ... -
类的初始化与清理
2013-06-24 22:20 1404初始化时内存清零 当创建一个对象时,首先将在堆上为这个对象分 ... -
protected,这个错了吗?
2013-06-24 22:17 1192这几天对protected修饰符有点迷糊,随便找同事要了一本 ... -
Java中BigDecimal的8种舍入模式
2013-06-21 18:42 2136java.math.BigDecimal不可变的、任意精度的 ... -
Tomcat性能参数设置
2010-12-27 15:35 34689默认参数不适合生产环境使用,因此需要修改一些参数 1、 ... -
Java 6 JVM参数选项大全
2010-12-14 11:16 1592http://kenwublog.com/docs/java6 ... -
对象的安全构造
2013-06-21 18:43 1501在构造期间,不要公布“this”引用 一种可以将数据争用引 ... -
Java断言(assert)—— 转
2010-06-20 10:36 12029一、概述 在C和C++语言中都有assert关键,表示断言。 ... -
eclipse调试
2010-06-04 00:11 7996eclipse远程调试 在eclipse3.4前,远程调试时 ... -
protected,你真的理解了吗?
2010-05-09 17:56 2079Java中的访问控制修饰符有四个级别,但属protected最 ... -
利用反射进行深层克隆
2010-05-05 21:02 3623最近在看《effective java ... -
类与类之间的几种关系
2010-05-03 13:49 2370类和类、类和接口、接 ... -
运行java
2010-05-03 13:47 1007用javac命令编译一个打包的类时,如果没有加参数" ... -
Java内存模型与volatile
2010-04-25 13:21 18486内存模型描述的是程序 ... -
中断线程
2010-04-24 21:19 8904中断线程 线程的thread.i ... -
java中的关键字、保留字、标示符
2010-04-07 23:48 3324关键字 Java的关键字对java的编译器有特殊的意义, ... -
Java中的浮点数剖析
2010-04-07 23:27 4648定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固 ... -
线程间的同步与互斥
2010-03-23 21:29 2258线程间的同步(实指线程间的通信):一般来说,一个线程相对于另 ... -
UTF-16、UTF-16BE、UTF-16LE编码方式的区别
2010-03-23 21:20 9687import java.io.IOException; ... -
final、finally、finalize
2010-01-22 01:15 2327final关键字 先看看final关键字,它可以被用于以下几个 ...
相关推荐
0.0.0 VScode插件platformIO开发环境的安装[esp32、8266]_̌萌新历险记的博客-CSDN博客.mhtml
五一数学建模
人工智能大模型体验报告3.0 目录 大模型产品测评综述 大模型产品现状与进程 3 .0版本大模型测评规则 大模型厂商整体测评 3.0版本大模型综合指数 3.0版本 测评细分维度指数及评述 测评题目展示 厂商最佳实践案例 厂商优秀案例展示 人工 智能大模型体验报告3.0.pdf (1.39 MB, 需要: RMB 9 元)
使用opencv进行人脸识别和对比-python源码.zip
触屏版自适应手机wap软件网站模板 触屏版自适应手机wap软件网站模板
基于matlab实现的GST模型的红外弱小目标检测代码.rar
LMDI(对数平均迪氏指数法)目前在能源消耗、碳排放等领域应用很多,总体来说并不 是一个很难的方法,但是相应的资料、步骤还是比较少。本人在写论文的时候,通过搜集资 料、研究,找到了stata的实现方法,来自于 Kerry Du老师写的一个模块l dmi,网址为: LMDI: Stata module to compute L ogarithmic Mean Divisia Index (LMDI) Dec omposition (repec.org) 大家可以自己去研究一下。对应的参考 文献就是Ang, B.W., 2005. The LMDI approach t odecomposition analysis: a practical gui de. Energy Policy 33, 867–871. 目前LMDI分解基 本都以这篇文献为参考,论坛里也有,大家可以下载去深入研究一下,总体并不难。 但是 对于LMDI方法的解读以及stata实现的步骤、过程,目前基本没有具体的中文资料 。 本文在写论文的过程中,进行了总结,现上传上来供大家参考,里面包括stata的 程序文件(ado
IEC 60695-11-2-2017 第11-2部分:试验火焰——1kW标称预混合火焰——装置、验证试验安排和指南.pdf
基于matlab实现的拉普拉斯金字塔分解 做毕业设计的可以参考,小波变换以及MGA的初级参考.rar
本文档是课题研究的研究报告内含调研以及源码设计以及结果分析
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
制造企业数字化转型ERP与CRM系统集成定位及场景构建方案.pptx
触屏版自适应手机wap软件网站模板 触屏版自适应手机wap软件网站模板
【课程设计全套资料】基于JAVA的管理系统
IEC 60730-2-13-2017.pdf
机械设计谷物洗涤机sw12非常好的设计图纸100%好用.zip
2000—2022年东中西分区域空间权重矩阵,省级层面,具体包括01矩阵,经济矩 阵,地理矩阵,经济地理矩阵以及经济地理嵌套矩阵,包含原始数据和计算过程,经济地理 权重矩阵采用2000-2022年数据,可以更改研究期间,里面有计算过程,地理距离 是用的欧式距离,如有疑问可与我私聊哈,大家放心下载。
TMCM-0930-TMCL 硬件手册
软件说明:先将要合并的.PDF类型文件放到一个文件夹里,然后点击”选择文件夹“选择它,再点击合并,确定存放位置确定后即可成功合并一个PDF类型的文件。在 Python 中,可以使用 PyPDF2 库来合并 PDF 文件。用 pip install PyPDF2 命令来安装这个库。
一、最短路径的概念及应用 在介绍最短路径之前我们首先要明白两个概念:什么是源点,什么是终点?在一条路径中,起始的第 一个节点叫做源点;终点:在一条路径中,最后一个的节点叫做终点;注意!源点和终点都只是相对 于一条路径而言,每一条路径都会有相同或者不相同的源点和终点。 而最短路径这个词不用过多解释,就是其字面意思: 在图中,对于非带权无向图而言, 从源点到终点 边最少的路径(也就是 BFS 广度优先的方法); 而对于带权图而言, 从源点到终点权值之和最少的 路径叫最短路径; 最短路径应用:道路规划; 我们最关心的就是如何用代码去实现寻找最短路径, 通过实现最短路径有两种算法:Dijkstra 迪杰斯 特拉算法和 Floyd 弗洛伊德算法, 接下来我会详细讲解 Dijkstra 迪杰斯特拉算法;