Java对象之间的深度复制拷贝

时间:2021-03-13 01:20:45
/*
* Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/ package java.lang; /**
* {@code RuntimeException} is the superclass of those
* exceptions that can be thrown during the normal operation of the
* Java Virtual Machine.
*
* <p>{@code RuntimeException} and its subclasses are <em>unchecked
* exceptions</em>. Unchecked exceptions do <em>not</em> need to be
* declared in a method or constructor's {@code throws} clause if they
* can be thrown by the execution of the method or constructor and
* propagate outside the method or constructor boundary.
*
* @author Frank Yellin
* @jls 11.2 Compile-Time Checking of Exceptions
* @since JDK1.0
*/
public class RuntimeException extends Exception {
static final long serialVersionUID = -7034897190745766939L; /** Constructs a new runtime exception with {@code null} as its
* detail message. The cause is not initialized, and may subsequently be
* initialized by a call to {@link #initCause}.
*/
public RuntimeException() {
super();
} /** Constructs a new runtime exception with the specified detail message.
* The cause is not initialized, and may subsequently be initialized by a
* call to {@link #initCause}.
*
* @param message the detail message. The detail message is saved for
* later retrieval by the {@link #getMessage()} method.
*/
public RuntimeException(String message) {
super(message);
} /**
* Constructs a new runtime exception with the specified detail message and
* cause. <p>Note that the detail message associated with
* {@code cause} is <i>not</i> automatically incorporated in
* this runtime exception's detail message.
*
* @param message the detail message (which is saved for later retrieval
* by the {@link #getMessage()} method).
* @param cause the cause (which is saved for later retrieval by the
* {@link #getCause()} method). (A <tt>null</tt> value is
* permitted, and indicates that the cause is nonexistent or
* unknown.)
* @since 1.4
*/
public RuntimeException(String message, Throwable cause) {
super(message, cause);
} /** Constructs a new runtime exception with the specified cause and a
* detail message of <tt>(cause==null ? null : cause.toString())</tt>
* (which typically contains the class and detail message of
* <tt>cause</tt>). This constructor is useful for runtime exceptions
* that are little more than wrappers for other throwables.
*
* @param cause the cause (which is saved for later retrieval by the
* {@link #getCause()} method). (A <tt>null</tt> value is
* permitted, and indicates that the cause is nonexistent or
* unknown.)
* @since 1.4
*/
public RuntimeException(Throwable cause) {
super(cause);
} /**
* Constructs a new runtime exception with the specified detail
* message, cause, suppression enabled or disabled, and writable
* stack trace enabled or disabled.
*
* @param message the detail message.
* @param cause the cause. (A {@code null} value is permitted,
* and indicates that the cause is nonexistent or unknown.)
* @param enableSuppression whether or not suppression is enabled
* or disabled
* @param writableStackTrace whether or not the stack trace should
* be writable
*
* @since 1.7
*/
protected RuntimeException(String message, Throwable cause,
boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
  package com.todaytech.pwp.core.exception;

  public class SysException
extends RuntimeException
{
public SysException() {} public SysException(String message)
{
super(message);
} public SysException(String message, Throwable cause)
{
super(message, cause);
} public SysException(Throwable cause)
{
super(cause);
}
}
 package com.todaytech.pwp.core.util.beanutils;

 import com.todaytech.pwp.core.exception.SysException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.DynaBean;
import org.apache.commons.beanutils.DynaClass;
import org.apache.commons.beanutils.DynaProperty;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.beanutils.converters.BigDecimalConverter; public final class ReflectUtil
{
private ReflectUtil() {} public static String getFieldByName(Object orig, String fieldName, boolean pbIgnoreCase)
{
Field[] origFields = getDeclaredFieldsForClass(orig.getClass());
String fieldNameToFind = fieldName;
if (pbIgnoreCase) {
fieldNameToFind = fieldName.toUpperCase();
}
Object objValue = null; for (int i = 0; i < origFields.length; i++) {
Field origField = origFields[i];
String name = origField.getName();
if (pbIgnoreCase) {
name = name.toUpperCase();
}
if (name.equals(fieldNameToFind)) {
origField.setAccessible(true);
try {
objValue = origField.get(orig);
} catch (IllegalAccessException e) {
throw new SysException(e);
}
origField.setAccessible(false);
break;
}
}
if (objValue != null) {
return ConvertUtils.convert(objValue);
}
return null;
} public static void setFieldByName(Object orig, String fieldName, String value, boolean pbIgnoreCase)
{
Field[] origFields = getDeclaredFieldsForClass(orig.getClass());
String fieldNameToFind = fieldName;
if (pbIgnoreCase) {
fieldNameToFind = fieldName.toUpperCase();
}
boolean found = false; for (int i = 0; i < origFields.length; i++) {
Field origField = origFields[i];
String name = origField.getName();
if (pbIgnoreCase) {
name = name.toUpperCase();
}
if (name.equals(fieldNameToFind)) {
origField.setAccessible(true);
try {
origField.set(orig, value);
} catch (IllegalAccessException e) {
throw new SysException(e);
}
origField.setAccessible(false);
found = true;
break;
}
}
if (!found) {
throw new IllegalArgumentException("Field not found. fieldName ='" + fieldName + "'");
}
} public static Object invokeMethod(Object owner, String methodName, Object... args)
{
Class ownerClass = owner.getClass();
Class[] argsClass = new Class[args.length];
int i = 0; for (int j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Method method = null;
try {
method = ownerClass.getMethod(methodName, argsClass);
return method.invoke(owner, args);
} catch (NoSuchMethodException e) {
throw new SysException(e);
} catch (InvocationTargetException e) {
throw new SysException(e);
} catch (IllegalAccessException e) {
throw new SysException(e);
}
} public static Object invokeStaticMethod(String className, String methodName, Object... args)
{
Class ownerClass = null;
try {
ownerClass = Class.forName(className);
Class[] argsClass = new Class[args.length];
int i = 0; for (int j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName, argsClass);
return method.invoke(null, args);
} catch (ClassNotFoundException e) {
throw new SysException(e);
} catch (InvocationTargetException e) {
throw new SysException(e);
} catch (NoSuchMethodException e) {
throw new SysException(e);
} catch (IllegalAccessException e) {
throw new SysException(e);
}
} public static Object newInstance(String className, Object... args)
{
Class newoneClass = null;
try {
newoneClass = Class.forName(className);
Class[] argsClass = new Class[args.length];
int i = 0; for (int j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Constructor cons = newoneClass.getConstructor(argsClass);
return cons.newInstance(args);
} catch (ClassNotFoundException e) {
throw new SysException(e);
} catch (InvocationTargetException e) {
throw new SysException(e);
} catch (NoSuchMethodException e) {
throw new SysException(e);
} catch (InstantiationException e) {
throw new SysException(e);
} catch (IllegalAccessException e) {
throw new SysException(e);
}
} public static void copyNotNullProperties(Object objFrom, Object objTo)
{
copyAllPropertiesByName(objFrom, objTo, false);
} public static void copyAllProperties(Object objFrom, Object objTo)
{
ConvertUtils.register(new DateConverter(), java.util.Date.class);
ConvertUtils.register(new DateConverter(), java.sql.Date.class);
ConvertUtils.register(new BigDecimalConverter(null), BigDecimal.class);
copyAllPropertiesByName(objFrom, objTo, true);
} private static void copyAllPropertiesByName(Object objFrom, Object objTo, boolean bIncludeNull)
{
if (bIncludeNull) {
try {
BeanUtils.copyProperties(objTo, objFrom);
} catch (IllegalAccessException e) {
throw new SysException(e);
} catch (InvocationTargetException e) {
throw new SysException(e);
}
} else {
copyProperties(objTo, objFrom, bIncludeNull);
}
} private static void copyProperties(Object dest, Object orig, boolean bIncludeNull)
{
if (dest == null) {
throw new IllegalArgumentException("No destination bean specified");
}
if (orig == null) {
throw new IllegalArgumentException("No origin bean specified");
} if ((orig instanceof DynaBean)) {
copyDynaBean(dest, (DynaBean)orig, bIncludeNull);
} else if ((orig instanceof Map)) {
copyBeanMap(dest, (Map)orig, bIncludeNull);
} else {
copyBeanArray(dest, orig, bIncludeNull);
}
} private static void copyBeanArray(Object dest, Object orig, boolean bIncludeNull) {
PropertyDescriptor[] origDescriptors = PropertyUtils.getPropertyDescriptors(orig);
for (int i = 0; i < origDescriptors.length; i++) {
String name = origDescriptors[i].getName();
if (!"class".equals(name))
{ if ((PropertyUtils.isReadable(orig, name)) && (PropertyUtils.isWriteable(dest, name)))
try {
Object value = PropertyUtils.getSimpleProperty(orig, name);
if ((bIncludeNull) || (value != null)) {
BeanUtils.copyProperty(dest, name, value);
}
} catch (NoSuchMethodException ex) {
throw new SysException(ex);
} catch (InvocationTargetException e) {
throw new SysException(e);
} catch (IllegalAccessException e) {
throw new SysException(e);
}
}
}
} private static void copyBeanMap(Object dest, Map orig, boolean bIncludeNull) {
Iterator names = orig.keySet().iterator();
while (names.hasNext()) {
String name = (String)names.next();
if (PropertyUtils.isWriteable(dest, name)) {
Object value = orig.get(name);
if ((bIncludeNull) || (value != null)) {
try {
BeanUtils.copyProperty(dest, name, value);
} catch (IllegalAccessException e) {
throw new SysException(e);
} catch (InvocationTargetException e) {
throw new SysException(e);
}
}
}
}
} private static void copyDynaBean(Object dest, DynaBean orig, boolean bIncludeNull) {
DynaProperty[] origDescriptors = orig.getDynaClass().getDynaProperties();
for (int i = 0; i < origDescriptors.length; i++) {
String name = origDescriptors[i].getName();
if (PropertyUtils.isWriteable(dest, name)) {
Object value = orig.get(name);
if ((bIncludeNull) || (value != null)) {
try {
BeanUtils.copyProperty(dest, name, value);
} catch (IllegalAccessException e) {
throw new SysException(e);
} catch (InvocationTargetException e) {
throw new SysException(e);
}
}
}
}
} public static void setPropertyByName(Object objTo, String sFieldName, Object value, boolean bIgnoreCase)
{
if (bIgnoreCase) {
sFieldName = findPropertyName(objTo.getClass(), sFieldName);
}
try {
BeanUtils.copyProperty(objTo, sFieldName, value);
} catch (IllegalAccessException e) {
throw new SysException(e);
} catch (InvocationTargetException e) {
throw new SysException(e);
}
} private static String findPropertyName(Class objClz, String sFieldName)
{
Field[] fields = getDeclaredFields(objClz);
String sToRet = null;
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String fieldName = field.getName();
if (fieldName.equalsIgnoreCase(sFieldName)) {
sToRet = fieldName;
break;
}
}
return sToRet;
} private static Field[] getDeclaredFields(Class objClz)
{
ArrayList fields = new ArrayList();
Class curClz = objClz;
Collections.addAll(fields, curClz.getDeclaredFields());
while (curClz.getSuperclass() != Object.class) {
curClz = curClz.getSuperclass();
Collections.addAll(fields, curClz.getDeclaredFields());
}
return (Field[])fields.toArray(new Field[fields.size()]);
} private static Field[] getDeclaredFieldsForClass(Class clz)
{
if (clz == Object.class) {
return new Field[0];
}
ArrayList<Field> fieldlist = new ArrayList();
fieldlist.addAll(Arrays.asList(clz.getDeclaredFields()));
Field[] fieldsOfSuperClz = getDeclaredFieldsForClass(clz.getSuperclass());
if (fieldsOfSuperClz != null) {
fieldlist.addAll(Arrays.asList(fieldsOfSuperClz));
}
return (Field[])fieldlist.toArray(new Field[0]);
} private static Map<String, Object> describeByFields(Object obj, boolean bGetSuperClassToo)
{
if (obj == null) {
throw new IllegalArgumentException("No obj specified");
}
Class classToView = obj.getClass();
return describeByFields(obj, classToView, bGetSuperClassToo);
} private static Map<String, Object> describeByFields(Object obj, Class pClassToView, boolean bGetSuperClassToo)
{
Map<String, Object> toReturn = new HashMap();
if (bGetSuperClassToo) {
Class superclz = pClassToView.getSuperclass();
if (superclz != Object.class) {
toReturn.putAll(describeByFields(obj, superclz, bGetSuperClassToo));
}
}
Field[] origFields = pClassToView.getDeclaredFields();
for (Field origField : origFields) {
String name = origField.getName();
origField.setAccessible(true);
try {
toReturn.put(name, origField.get(obj));
} catch (IllegalAccessException e) {
throw new SysException(e);
}
}
return toReturn;
} public static <T> Class<T> getGenericTypeArgument(Class clazz)
{
return getGenericTypeArgument(clazz, 0);
} public static Class getGenericTypeArgument(Class clazz, int index)
{
Type genType = clazz.getGenericSuperclass(); if (!(genType instanceof ParameterizedType))
{
return Object.class;
} Type[] params = ((ParameterizedType)genType).getActualTypeArguments(); if ((index >= params.length) || (index < 0))
{ return Object.class;
}
if (!(params[index] instanceof Class))
{
return Object.class;
} return (Class)params[index];
}
}

Java对象之间的深度复制拷贝的更多相关文章

  1. JSON 与JAVA对象之间的转换(转)

    JSON与XML两者目前在数据交互方面都有很高的使用率,随着现在SOA的兴起,异构系统的整合地位相应提高,本篇文章主要介绍JSON与JAVA对象之间的相互转换. 一.对普通类型的JSON模式的转换 一 ...

  2. 别名现象,java对象之间的相互赋值

    请看一下代码 import java.util.*; class book{ static  int c = null; } public static void main(String[] args ...

  3. json、xml和java对象之间的转化

    其实从面相对象的角度来理解这个问题,就会很清晰.java中的一切皆对象即把世间万物(Everything in the world)看做java对象,任何处理不了的问题都可以先转化成java对象在做处 ...

  4. JAVA里面json和java对象之间的相互转换

    1. 把java 对象列表转换为json对象数组,并转为字符串 JSONArray array = JSONArray.fromObject(list);    String jsonstr = ar ...

  5. XML字符串和JAVA对象之间的转化

     1.JAXB中相关的注解.类和接口说明 JAXB 中主要的一些注解 - shenyunsese 的专栏 - CSDN 博客 注:教程很全面很详细.但是仅供参考. 主要疑问区分和说明:  1.1 @X ...

  6. java 对象之间的复制

    package com.jy.demo.web; import java.util.Date; public class People { private String name;//姓名 priva ...

  7. &lbrack;No0000B9&rsqb;C&num; 类型基础 值类型和引用类型 及其 对象复制 浅度复制vs深度复制 深入研究2

    接上[No0000B5]C# 类型基础 值类型和引用类型 及其 对象判等 深入研究1 对象复制 有的时候,创建一个对象可能会非常耗时,比如对象需要从远程数据库中获取数据来填充,又或者创建对象需要读取硬 ...

  8. js对象&sol;数组深度复制

    今天碰到个问题,js对象.数组深度复制:之前有见过类似的,不过没有实现函数复制,今晚想了一下,实现代码如下: function clone(obj) { var a; if(obj instanceo ...

  9. JAVA对象和XML文档、原来他们之间还有这一出

    最近项目开发中遇到一个问题,访问接口不再通过url地址请求的方式,而是 通过socket发送xml格式的报文到指定服务器来进行信息的统一认证.. 因此组装xml格式的报文字符串以及解析服务器返回的xm ...

随机推荐

  1. 进程间通信(IPC)介绍

    进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息. IPC的方式通常有管道(包括无名管道和命名管道).消息队列.信号量.共享存储.Socket ...

  2. iOS&colon; 使用CGContextRef,CGPath和UIBezierPath来绘画

    这三种东西:CGContextRef,CGPath和UIBezierPath.本质上都是一样的,都是使用Quartz来绘画.只不过把绘图操作暴露在不同的API层面上,在具体实现上,当然也会有一些细小的 ...

  3. 用C语言计算圆的面积~!!!!!!!

    #include <stdio.h>void main(){ int a,b,c,y,g,f; printf("圆柱底面的半径,圆柱的高"); scanf(" ...

  4. 【HDU 1828】 Picture (矩阵周长并,线段树,扫描法)

    [题目] Picture Problem Description A number of rectangular posters, photographs and other pictures of ...

  5. UIScrollViewA都PI得知。

    //1.设定滚定条的样式 typedef NS_ENUM(NSInteger, UIScrollViewIndicatorStyle) { UIScrollViewIndicatorStyleDefa ...

  6. 《javascript设计模式与开发实践》阅读笔记(10)—— 组合模式

    组合模式:一些子对象组成一个父对象,子对象本身也可能是由一些孙对象组成. 有点类似树形结构的意思,这里举一个包含命令模式的例子 var list=function(){ //创建接口对象的函数 ret ...

  7. Codeforces --- 982C Cut &&num;39&semi;em all&excl; DFS加贪心

    题目链接: https://cn.vjudge.net/problem/1576783/origin 输入输出: ExamplesinputCopy42 44 13 1outputCopy1input ...

  8. Python自动化测试用例设计--测试类型

    1.前言 WEB自动化测试时候测试哪些类型,下面将介绍一下: 2. 测试类型 2.1 测试静态内容 静态内容测试是最简单的测试,用于验证静态的.不变化的UI 元素的存在性.例如: 每个页面都有其预期的 ...

  9. django -- verbose&lowbar;name的对数据库层面的影响

    一.没有verbose_name时model的定义: from django.db import models # Create your models here. class Question(mo ...

  10. JavaScript &amp&semi; jQuery Code Snippet

    1. 按照每个object的Name属性对object对象集合进行排序: //sort a collection of objects by Name property function sortBy ...