`

(JAVA子类引用指象父类引用)JAVA克隆对象,包括父类属性,无需实现序列化接口

阅读更多

最近做一个东西,需要拷贝一个对象,而且父类属性也需要拷贝。.很多人可能会说直接引用待拷贝的对象就可以了。但是这个方法支持了使用子类引用指象父类引用。以下是代码:/**

	 
/** 将sourceObj的属性拷贝到targetObj
	 * @param sourceObj
	 * @param targetObj
	 * @param clazz 从哪一个类开始(比如sourceObj对象层级为:Object->User->ChineseUser->ChineseMan->ChineseChongQingMan)
	 * 如果需要从ChineseUser开始复制,clazz就指定为ChineseUser.class
	 */
	public static void cpoyObjAttr(Object sourceObj,Object targetObj, Class<?> clazz)throws Exception{
		if(sourceObj==null || targetObj==null){
 			throw new Exception("源对象和目标对象不能为null");
		}
		Field[] fields=clazz.getDeclaredFields();
		for(int i = 0; i < fields.length; i++){
			 fields[i].setAccessible(true);
			 Object sourceValue=fields[i].get(sourceObj);
			 fields[i].set(targetObj,sourceValue );
		}
		if(clazz.getSuperclass()==Object.class){
			return;
		}
		cpoyObjAttr(sourceObj,targetObj,clazz.getSuperclass());
		 
	}

 以下是单元测试:

	@Test
	public void cpoyObjAttrTtest(){
		ChineseMan chineseMan=new ChineseMan();
		chineseMan.setUserName("程序员");
		chineseMan.setCat(new Cat("tom"));
		 
		try {
			ChineseManExtend chineseManExtend=new ChineseManExtend();
			ObjectTool.cpoyObjAttr(chineseMan, chineseManExtend, chineseMan.getClass());
			System.out.println(chineseManExtend.getUserName());
			System.out.println(chineseManExtend.getCat().getCatName());

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
0
0
分享到:
评论
6 楼 bernoulli 2013-01-11  
小混蛋 写道
bernoulli 写道
小混蛋 写道
clazz.getDeclaredFields();  这个方法不能取父类的属性的。API:
public Field[] getDeclaredFields()
                          throws SecurityException返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段,包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何字段,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。

所以我用了递归



嗯,没看到递归。。。cpoyObjAttr(sourceObj,targetObj,clazz.getSuperclass()); clazz.getSuperclass()


@小混蛋
这就是递归。clazz.getSuperclass()每次传入的是父类
5 楼 小混蛋 2013-01-10  
bernoulli 写道
小混蛋 写道
clazz.getDeclaredFields();  这个方法不能取父类的属性的。API:
public Field[] getDeclaredFields()
                          throws SecurityException返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段,包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何字段,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。

所以我用了递归



嗯,没看到递归。。。cpoyObjAttr(sourceObj,targetObj,clazz.getSuperclass()); clazz.getSuperclass()
4 楼 bernoulli 2013-01-09  
小混蛋 写道
clazz.getDeclaredFields();  这个方法不能取父类的属性的。API:
public Field[] getDeclaredFields()
                          throws SecurityException返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段,包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何字段,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。

所以我用了递归
3 楼 小混蛋 2013-01-09  
clazz.getDeclaredFields();  这个方法不能取父类的属性的。API:
public Field[] getDeclaredFields()
                          throws SecurityException返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段,包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何字段,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。
2 楼 bernoulli 2013-01-09  
冲杯茶喝 写道
ChineseUser开始,Field[] fields=clazz.getDeclaredFields();  这些变量也只是ChineseUser以上的啊,而不是以下啊。

就是以上额。需求就是以上。
1 楼 冲杯茶喝 2013-01-09  
ChineseUser开始,Field[] fields=clazz.getDeclaredFields();  这些变量也只是ChineseUser以上的啊,而不是以下啊。

相关推荐

    java对象的 生命周期

    4. **反序列化**:通过`java.io.ObjectInputStream`的`readObject()`方法将序列化的对象恢复为内存中的对象实例。 #### 构造方法 构造方法是用于初始化对象的关键组件。它有以下几个特点和用法: - **重载构造...

    java面试题及答案大全

    4. 序列化和反序列化:对象的持久化和恢复。 5. 工具类静态方法,如`Collections.emptyList()`。 **`switch`语句** 在Java 7之前,`switch`仅支持byte、short、char、int及其对应的封装类以及Enum。从Java 7开始,`...

    Java基础的面试题总结

    - **多态**:多态是指父类引用可以指向子类对象,允许在不同对象上调用相同的方法,表现出不同的行为。多态有两种形式:显式多态(方法重写)和隐式多态(方法覆盖和接口实现)。 2. **创建对象**:Java中创建对象...

    java面试笔记整理,包含java,redis,kafka等

    - **实现Serializable接口是Java对象序列化的前提条件。** - **允许对象被序列化和反序列化。 #### 四十六、显式指定serialVersionUID的原因 - **保证序列化兼容性:** 如果类的结构发生变化,serialVersionUID保持...

    java基础知识

    本文概述了Java语言的基础知识,包括面向对象的基本概念、类与对象的创建、包的使用、继承与多态、抽象类与接口、修饰符的作用、反射机制的应用、接口的实现、克隆与序列化的处理以及异常管理等内容。这些核心概念...

    java最新面试题50道精讲

    接口多态是通过实现多个接口来实现多态,继承多态是通过子类继承父类并重写方法,类型强制转换则是将对象转换为不同类型的引用。多态性依赖于Java虚拟机的动态派发机制,在运行时根据对象实际类型调用相应的方法。 ...

    2019年最新版修订版Java程序员面试宝典.pdf

    6. **Java序列化**:通过实现`Serializable`接口可以实现对象的序列化。 ##### 八、Java的集合 1. **`HashMap`排序题**:由于`HashMap`内部使用哈希表实现,其元素顺序是不确定的。若需排序,可以使用`TreeMap`或...

    JAVA面试题17087.pdf

    Java不支持像C++那样的复制构造函数,但可以通过克隆或序列化等方式实现类似的功能。 了解和掌握这些Java面试题中的知识点对于成为一名优秀的Java开发者至关重要,它们涵盖了OOP的核心原理以及Java语言的关键特性。...

    java相关笔试面试题之二

    5. **Java序列化**:序列化是将对象的状态转换为字节流的过程,以便存储或在网络中传输。要实现序列化,需要让类实现`Serializable`接口。反序列化则是将字节流恢复为对象的过程。 6. **静态方法和非静态方法**:...

    2015Java面试指南

    - **Java实现浅克隆与深克隆**:浅克隆复制对象本身及含有引用的对象地址,而深克隆则复制了对象本身及所有成员变量的值。 - **枚举可以序列化吗**:枚举类型默认实现了`Serializable`接口,因此可以直接进行序列化...

    Java程序员面试宝典

    - **详解:** 在Java中,克隆可以通过实现`Cloneable`接口并重写`clone()`方法来完成。`clone()`方法位于`Object`类中,它用于创建对象的一个精确副本。 **22. 静态初始化块** - **知识点:** 静态初始化块用于初始...

    Java 课件

    2. **JAVA-L9-ExtendingClass.ppt** - 继承(Extending Class)是面向对象编程的关键特性,允许一个类(子类)继承另一个类(父类)的属性和方法。这有助于代码复用,同时也可以实现类的层次结构,方便地创建具有...

    Java基础面试题常见题目经典精选大全.docx

    Cloneable和Serializable接口分别用于对象克隆和序列化。 15. **HashMap**:HashMap基于哈希表实现,提供了高效的插入、删除和查找操作。`hashCode()`和`equals()`方法对于HashMap的正确运作至关重要,因为它们用于...

    JAVA面试宝典

    Collection接口不提供克隆和序列化方法,是因为克隆和序列化是对象的特定行为,每个集合实现可以决定其具体实现方式。 4.3 什么是迭代器(Iterator)? 迭代器提供了一种遍历集合的方法,用于访问集合中的元素。 ...

    java程序员面试宝典

    该文件为Java程序员面试宝典的一部分,主要内容包括Java基础知识点的面试问题及其答案,非常适合准备参加Java程序员面试的求职者。以下是详细的知识点: 1. Java源文件中可以包括多个类,但只能有一个公共类...

    JAVA常见面试题300道

    如果不实现这两个接口,Java 无法保证对象的状态可以正确复制或恢复,因此不能进行克隆或序列化操作。 #### 20. Iterator 接口的功能是什么? Iterator 接口提供了遍历集合元素的标准方法。它允许用户迭代地访问...

    Java程序员面试宝典——2012版

    当子类重写父类的方法,并通过父类引用调用子类对象的方法时,实际执行的是子类的方法版本,这就是多态性的体现。 #### 24. 抽象类与接口的区别 抽象类可以包含抽象方法和具体方法,可以有构造器、字段等,主要...

    java面试题_(精典).doc

    实现序列化需使类实现`Serializable`接口,然后使用`ObjectOutputStream`和`ObjectInputStream`类进行序列化和反序列化。 #### 7. ".java"源文件中包含多个类的规则 一个`.java`文件可以包含多个类,但只能有一个...

Global site tag (gtag.js) - Google Analytics