`
hu2004hx
  • 浏览: 19902 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

两个对象之间根据属性名拷贝

阅读更多
// TODO 放软应用,以及以下代码应该发在公共的工具类中
	//缓存存放类的field信息
	private static Map<Class<?>, Map<String, Field>> fieldsCache = new HashMap<Class<?>,  Map<String, Field>>();
	private ReadWriteLock rw = new ReentrantReadWriteLock();

	private  Map<String, Field> getAllFieldsOfClass(Class<?> cls) {
		rw.readLock().lock();
		 Map<String, Field> fieldmap = null;
		try {
			fieldmap = fieldsCache.get(cls);
			if (fieldmap == null) {
				rw.readLock().unlock();
				rw.writeLock().lock();
				try {
					if (fieldmap == null) {
						fieldmap = new HashMap<String, Field>();
						Class<?> itr = cls;
						while ((null != itr) && !itr.equals(Object.class)) {
							Field[] declaredFields = itr.getDeclaredFields();
							if(declaredFields != null && declaredFields.length > 0){
								for(Field f : declaredFields){
									String fieldName = f.getName();
									if(fieldmap.get(fieldName) == null && !"serialVersionUID".equals(fieldName)
											&& !Modifier.isStatic(f.getModifiers())){
										fieldmap.put(fieldName, f);
										f.setAccessible(true);
									}
								}
							}
							itr = itr.getSuperclass();
						}
						fieldsCache.put(cls, fieldmap);
					}
				} finally {
					rw.writeLock().unlock();
				}
				rw.readLock().lock();
			}
		} finally {
			rw.readLock().unlock();
		}
		return fieldmap;
	}

	// TODO 放util类中
	private <T, R> R simpleConvertType(T t, Class<R> clazz) throws Exception {
		if (t == null)
			return null;
		Map<String, Field> fromFieldMap = getAllFieldsOfClass(t.getClass());
		R target = clazz.newInstance();
		Map<String, Field> toFieldMap = getAllFieldsOfClass(clazz);
		for(Map.Entry<String, Field> en : toFieldMap.entrySet()){
			String fieldName = en.getKey();
			Field valueField = fromFieldMap.get(fieldName);
			if(valueField != null){
				en.getValue().set(target, valueField.get(t));
			}
		}
		return target;
	}
分享到:
评论

相关推荐

    两个对象属性值的拷贝和文件的拷贝

    实现了两个对象之间属性值的拷贝,只要具有相同的属性名就可以拷贝,还有两个file对象的拷贝,实现文件的复制功能

    idea插件实现自动set属性拷贝

    (Student2)student //在这个表达式(记得光标在表达式里面哦)按下alt+Enter,选中“哟嚯。。。好爽啊”就能自动生成下面代码 Student2 student2=new Student2(); student2.setFiled1(student.getFiled1()); ...

    实验4 类与对象

    Cpu为CPU类的一个对象,ram为RAM类的一个对象,cdrom为CDROM类的一个对象,声明并实现这个类。(选做)涉及一个用于人事管理的people(人员)类。考虑通用性,这里只抽象出所有类型人员都具有的属性:number(编号)...

    python-拷贝构造函数.docx

    这个函数通常被用来创建一个新的对象,该对象与原始对象具有相同的属性和方法,但是它们是两个不同的对象。 拷贝构造函数的语法非常简单,只需要在类定义中添加一个特殊的方法即可。下面是一个示例: ``` class ...

    javascript文档

    :) 根据条件执行两个表达式之一。 constructor 属性 指定创建对象的函数。 continue 语句 停止循环的当前迭代,并开始一次新的迭代。 cos 方法 返回一个数的余弦。 Date 对象 提供日期和时间的基本存储和检索。...

    JScript 语言参考

    :) 根据条件执行两个表达式之一。 constructor 属性 指定创建对象的函数。 continue 语句 停止循环的当前迭代,并开始一次新的迭代。 cos 方法 返回一个数的余弦。 Date 对象 提供日期和时间的基本存储和检索。...

    微软JavaScript手册

    :) 根据条件执行两个表达式之一。 constructor 属性 指定创建对象的函数。 continue 语句 停止循环的当前迭代,并开始一次新的迭代。 cos 方法 返回一个数的余弦。 Date 对象 提供日期和时间的基本存储和检索。...

    数组的深拷贝与浅拷贝以及数组拷贝的几种方式比较

    目录一、深拷贝与浅拷贝解析浅拷贝...浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化。 1.对于八种基本数据类型说,它们的拷贝是值传递,修改拷贝对象的数

    浅析iOS中的浅拷贝和深拷贝(copy和mutableCopy)

    ios提供了copy和mutablecopy方法,顾名思义,copy...retain属性表示两个对象地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1也就是说,retain 是指针拷贝,copy 是内容拷贝。 当然在iOS中并

    jsp内置对象的用法

    在任何地方对此对象属性 的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。 序号 方 法 说 明 1 Object getAttribute(String name) 返回给...

    C++实验2 类与对象

    (2)定义一个简单的Computer类,有数据成员芯片(CPU),内存(ram),光驱(cdrom)等等,有两个公有成员函数run、stopo,CPU为CPU类的一个对象,ram为RAM类的一个对象,cdrom为CDROM类的一个对象,定义并实现这个类。...

    PHP 面向对象技术(全面讲解).txt

    共有3 次new Person(),所以会在堆里面开辟3 个空间,产生3 个实例对象,每个对象之间都是相 互独立的,使用自己的空间,在PHP 里面,只要有一个new 这个关键字出现就会实例化出来一个对 象,在堆里面开辟一块自己的...

    按以下描述和要求建立两个类:基类 Rectangle(矩形类) 和派生类 Cube(正方体)

    按以下描述和要求建立两个类:基类 Rectangle(矩形类) 和派生类 Cube(正方体) 1. Rectangle 私有成员:  double x1, y1; //左下角的坐标  double x2, y2; //右上角的坐标 公有成员:  带缺省值的构造...

    浅谈C++中对象的复制与对象之间的相互赋值

    有时需要用到多个完全相同的对象,例如,同一型号的每一个产品从外表到内部属性都是一样的,如果要对每一个产品分别进行处理,就需要建立多个同样的对象,并要进行相同的初始化,用以前的办法定义对象(同时初始化)...

    设计一个学生类Student(学生学号、姓名、数学、英语、计算机成绩;)

    1.设计一个学生类Student。 1)数据成员包括: 学生学号、姓名、数学、英语、c语言成绩;(用字符指针存储学号和姓名,通过动态存储空间分配的方式为指针开辟指向的空间,保证空间大小没有浪费) 2)成员函数包括: 设置...

    【JavaScript源代码】怎样用JavaScript实现原型模式.docx

     概述 原型模式是指原型实例指向创建对象的种类,并通过拷贝这些原型创建新的对象,是一种用来创建对象的模式,也就是创建一个对象作为另一个对象的prototype属性; prototype警告:学习了解原型模式前需先学习...

    C++图书馆管理系统

    属性是对一个对象状态的描述,如“在馆图书类”,从流通管理的角度来看,应包含书名Title、作者名Author、分类号IndexCode、册数Number、条码号BarCode等属性。 其它类的属性如下: 读者类,包含姓名Name、职务...

    JavaScript中的拷贝(copy)

    }这个对象,想要复制对象obj1,一贯的做法就是obj2 = obj1,这时虽然obj2拥有了obj1的所有属性,但obj2却不是自由的,因为它的改动会影响到obj1,obj1的改动也会影响到obj2,这不是我们所希望的,所以要用到深拷贝和...

    C++程序设计代码

    2.设计并测试一个名为Rectangle的矩形类,其属性为矩形的左下角和右上角两个点的坐标,有成员函数能计算矩形的面积。 3.定义一个CPU类,包含等级、频率,电压等属性,并编写构造函数、析构函数,以及成员函数run、...

    定义类实现矩阵加减法

    矩阵相加的函数,实现两个矩阵相加的功能,结果保存在另一个矩阵类,但必须矩阵大小相同; 矩阵相减的函数,实现两个矩阵相减的功能,结果保存在另一个矩阵类,但必须矩阵大小相同。 (3) 定义三个矩阵:A1、A2、A3...

Global site tag (gtag.js) - Google Analytics