`

(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. 序列化和反序列化:对象的持久化和恢复。 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 课件

    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 接口提供了遍历集合元素的标准方法。它允许用户迭代地访问...

    对参数 对象的理解方法

    - **序列化**:通过实现`Serializable`接口,可以使一个对象被序列化成字节流,以便于持久化存储或网络传输。 #### 十、迭代器 - **迭代器(Iterator)**:用于遍历集合中的元素,提供了一系列方法,如`hasNext()`...

    Java 语言程序设计基础

    12. **对象克隆:** 通过 `clone()` 方法实现对象的复制。 #### 五、Java 的存储结构与程序运行机制 Java 的存储结构主要包括栈、堆和方法区等组成部分,这些结构共同协作支持 Java 程序的运行。 1. **栈:** ...

Global site tag (gtag.js) - Google Analytics