`
hu2004hx
  • 浏览: 20780 次
  • 性别: 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对象的拷贝,实现文件的复制功能

    MyBatisDemo && JAVA把一个对象的全部属性复制到另一个相同的对象

    这篇博文“MyBatisDemo && JAVA把一个对象的全部属性复制到另一个相同的对象”探讨的是如何在Java编程中实现对象属性的深度复制。MyBatis是一个流行的Java持久层框架,它简化了数据库操作,而对象复制则是处理业务...

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

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

    java不同对象及集合的多次复制

    这样,两个对象完全独立,互不影响。 2. **Java中的对象复制方法** - **clone()方法**:Java的Object类提供了一个`clone()`方法,但默认实现是浅拷贝。如果需要深拷贝,需要在每个需要复制的对象类中实现`...

    iOS深浅拷贝例子

    但是,如果属性是对象引用,那么新旧两个对象会共享同一个对象实例。这意味着对其中一个对象的属性进行修改会影响到另一个对象,因为它们都指向同一个内存地址。 在Objective-C中,实现浅拷贝通常通过遵循`...

    类属性拷贝器(源码)

    通常,此类会包含一个静态方法,如`CopyProperties()`,接受两个对象参数,然后进行属性拷贝。源代码可能包含了以下关键部分: - 使用`Type.GetProperties()`获取类的属性集合。 - 遍历源对象和目标对象的属性,...

    java值拷贝

    深拷贝则不仅复制对象本身,还会递归复制所有引用的对象,确保两个对象完全独立。 Apache Commons BeanUtils库中的`BeanUtils.copyProperties()`方法就是用来进行对象间属性值的浅拷贝。这个方法可以将一个对象的...

    定义一个名为complex 的复数类,其属性数据为复数的实部和虚部,要求构造函数和拷贝构造函数,并能打印复数的值

    在这个场景下,我们被要求定义一个名为`complex`的复数类,它代表数学中的复数,包含实部和虚部作为其属性。下面我们将深入探讨如何实现这个类,包括构造函数、拷贝构造函数以及复数的打印功能。 首先,我们需要...

    winform 深拷贝的实现源码

    如果属性值是引用类型,那么新旧两个对象会共享同一个引用,也就是说修改其中一个对象的引用属性会影响到另一个。在C#中,`MemberwiseClone()`方法就实现了浅拷贝。 2. **深拷贝**:深拷贝则会创建一个全新的对象,...

    【JavaScript源代码】详解jQuery的拷贝对象.docx

    执行深拷贝后,即使两个对象都包含 `msg` 属性,它们也不会共享相同的对象实例。 ##### 2. 执行过程解析 - **内存栈与内存堆**:在浅拷贝中,`rete` 对象里面的 `msg:{age:18}` 会覆盖掉 `taytuj` 对象的 `msg:{...

    C#两个类之间传值Demo

    在C#编程中,类之间的值...以上就是C#中两个类之间进行值传递的常见方法,根据具体需求选择合适的方式可以提高代码的灵活性和可维护性。在实际开发中,应根据项目规模、团队协作情况以及业务需求来决定使用哪种方式。

    ios-深拷贝对象.zip

    这两个方法分别负责对象的编码和解码,实现深拷贝的关键。 2. 在`encodeWithCoder:`方法中,你需要为模型类的每个属性调用coder对象的`encodeObject:forKey:`方法,以确保所有子对象都被正确编码。 3. 在`...

    javaEE的对象拷贝工具dozer

    在软件开发中,特别是在业务层处理数据时,我们经常需要将一个对象的属性值复制到另一个对象中,Dozer提供了一个优雅且高效的解决方案。 Dozer的核心功能在于对象之间的自动映射,它能够自动将源对象的属性值映射到...

    java对象的深拷贝和浅拷贝[归类].pdf

    在给出的例子中,我们有两个测试类`Test2`和`Test3`,分别演示了浅拷贝和深拷贝的效果。 - 在`Test2`中,通过简单赋值创建了一个新的`Test`对象`t2`,这是浅拷贝。当修改`t2`的属性时,`t1`的属性也会随之改变,...

    JavaScript对象拷贝与Object.assign用法实例分析

    这意味着,当修改其中一个对象的某个属性时,另一个对象的相应属性也会受到影响,因为它们都指向内存中的同一位置。在JavaScript中,通过简单赋值或使用`Object.assign()`方法可以实现浅拷贝。例如: ```javascript...

    JS 对象,属性

    在JS中,每个对象都有一个隐式原型属性 `__proto__`,指向创建它的构造函数的原型。这使得对象可以继承其他对象的属性和方法。通过 `prototype` 属性,可以在构造函数的原型上定义共享属性和方法。 六、属性的描述...

    1.深浅拷贝.pptx

    浅拷贝会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址。因此,如果其中一个对象改变了这个地址,...

    java对象复制克隆

    在Java编程中,对象复制和克隆是两个重要的概念,特别是在处理复杂数据结构时。对象复制通常分为浅拷贝和深拷贝。标题中的“java对象复制克隆”主要涉及的是深拷贝,这是一种创建一个新对象的方式,新对象不仅复制...

    拷贝模式

    两个对象共享同一份数据。 - 如果对象的属性是引用类型,那么浅拷贝只是复制引用,而不是复制引用指向的对象。这意味着修改其中一个对象的引用属性会影响到另一个对象。 2. 深拷贝(Deep Copy): - 对于深拷贝,...

    Java中的深拷贝(深复制)和浅拷贝(浅复制) 示例代码

    这意味着新旧两个对象指向相同的内存区域。如果原对象中的某个字段是基本类型,那么复制的是这些值;但如果字段是引用类型,那么复制的是引用,而非引用的对象内容。因此,改变其中一个对象的引用字段会影响另一个...

Global site tag (gtag.js) - Google Analytics