// 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把一个对象的全部属性复制到另一个相同的对象”探讨的是如何在Java编程中实现对象属性的深度复制。MyBatis是一个流行的Java持久层框架,它简化了数据库操作,而对象复制则是处理业务...
(Student2)student //在这个表达式(记得光标在表达式里面哦)按下alt+Enter,选中“哟嚯。。。好爽啊”就能自动生成下面代码 Student2 student2=new Student2(); student2.setFiled1(student.getFiled1()); ...
这样,两个对象完全独立,互不影响。 2. **Java中的对象复制方法** - **clone()方法**:Java的Object类提供了一个`clone()`方法,但默认实现是浅拷贝。如果需要深拷贝,需要在每个需要复制的对象类中实现`...
但是,如果属性是对象引用,那么新旧两个对象会共享同一个对象实例。这意味着对其中一个对象的属性进行修改会影响到另一个对象,因为它们都指向同一个内存地址。 在Objective-C中,实现浅拷贝通常通过遵循`...
通常,此类会包含一个静态方法,如`CopyProperties()`,接受两个对象参数,然后进行属性拷贝。源代码可能包含了以下关键部分: - 使用`Type.GetProperties()`获取类的属性集合。 - 遍历源对象和目标对象的属性,...
深拷贝则不仅复制对象本身,还会递归复制所有引用的对象,确保两个对象完全独立。 Apache Commons BeanUtils库中的`BeanUtils.copyProperties()`方法就是用来进行对象间属性值的浅拷贝。这个方法可以将一个对象的...
在这个场景下,我们被要求定义一个名为`complex`的复数类,它代表数学中的复数,包含实部和虚部作为其属性。下面我们将深入探讨如何实现这个类,包括构造函数、拷贝构造函数以及复数的打印功能。 首先,我们需要...
如果属性值是引用类型,那么新旧两个对象会共享同一个引用,也就是说修改其中一个对象的引用属性会影响到另一个。在C#中,`MemberwiseClone()`方法就实现了浅拷贝。 2. **深拷贝**:深拷贝则会创建一个全新的对象,...
执行深拷贝后,即使两个对象都包含 `msg` 属性,它们也不会共享相同的对象实例。 ##### 2. 执行过程解析 - **内存栈与内存堆**:在浅拷贝中,`rete` 对象里面的 `msg:{age:18}` 会覆盖掉 `taytuj` 对象的 `msg:{...
在C#编程中,类之间的值...以上就是C#中两个类之间进行值传递的常见方法,根据具体需求选择合适的方式可以提高代码的灵活性和可维护性。在实际开发中,应根据项目规模、团队协作情况以及业务需求来决定使用哪种方式。
这两个方法分别负责对象的编码和解码,实现深拷贝的关键。 2. 在`encodeWithCoder:`方法中,你需要为模型类的每个属性调用coder对象的`encodeObject:forKey:`方法,以确保所有子对象都被正确编码。 3. 在`...
在软件开发中,特别是在业务层处理数据时,我们经常需要将一个对象的属性值复制到另一个对象中,Dozer提供了一个优雅且高效的解决方案。 Dozer的核心功能在于对象之间的自动映射,它能够自动将源对象的属性值映射到...
在给出的例子中,我们有两个测试类`Test2`和`Test3`,分别演示了浅拷贝和深拷贝的效果。 - 在`Test2`中,通过简单赋值创建了一个新的`Test`对象`t2`,这是浅拷贝。当修改`t2`的属性时,`t1`的属性也会随之改变,...
这意味着,当修改其中一个对象的某个属性时,另一个对象的相应属性也会受到影响,因为它们都指向内存中的同一位置。在JavaScript中,通过简单赋值或使用`Object.assign()`方法可以实现浅拷贝。例如: ```javascript...
在JS中,每个对象都有一个隐式原型属性 `__proto__`,指向创建它的构造函数的原型。这使得对象可以继承其他对象的属性和方法。通过 `prototype` 属性,可以在构造函数的原型上定义共享属性和方法。 六、属性的描述...
浅拷贝会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址。因此,如果其中一个对象改变了这个地址,...
在Java编程中,对象复制和克隆是两个重要的概念,特别是在处理复杂数据结构时。对象复制通常分为浅拷贝和深拷贝。标题中的“java对象复制克隆”主要涉及的是深拷贝,这是一种创建一个新对象的方式,新对象不仅复制...
两个对象共享同一份数据。 - 如果对象的属性是引用类型,那么浅拷贝只是复制引用,而不是复制引用指向的对象。这意味着修改其中一个对象的引用属性会影响到另一个对象。 2. 深拷贝(Deep Copy): - 对于深拷贝,...
这意味着新旧两个对象指向相同的内存区域。如果原对象中的某个字段是基本类型,那么复制的是这些值;但如果字段是引用类型,那么复制的是引用,而非引用的对象内容。因此,改变其中一个对象的引用字段会影响另一个...