// 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对象的拷贝,实现文件的复制功能
(Student2)student //在这个表达式(记得光标在表达式里面哦)按下alt+Enter,选中“哟嚯。。。好爽啊”就能自动生成下面代码 Student2 student2=new Student2(); student2.setFiled1(student.getFiled1()); ...
Cpu为CPU类的一个对象,ram为RAM类的一个对象,cdrom为CDROM类的一个对象,声明并实现这个类。(选做)涉及一个用于人事管理的people(人员)类。考虑通用性,这里只抽象出所有类型人员都具有的属性:number(编号)...
这个函数通常被用来创建一个新的对象,该对象与原始对象具有相同的属性和方法,但是它们是两个不同的对象。 拷贝构造函数的语法非常简单,只需要在类定义中添加一个特殊的方法即可。下面是一个示例: ``` class ...
:) 根据条件执行两个表达式之一。 constructor 属性 指定创建对象的函数。 continue 语句 停止循环的当前迭代,并开始一次新的迭代。 cos 方法 返回一个数的余弦。 Date 对象 提供日期和时间的基本存储和检索。...
:) 根据条件执行两个表达式之一。 constructor 属性 指定创建对象的函数。 continue 语句 停止循环的当前迭代,并开始一次新的迭代。 cos 方法 返回一个数的余弦。 Date 对象 提供日期和时间的基本存储和检索。...
:) 根据条件执行两个表达式之一。 constructor 属性 指定创建对象的函数。 continue 语句 停止循环的当前迭代,并开始一次新的迭代。 cos 方法 返回一个数的余弦。 Date 对象 提供日期和时间的基本存储和检索。...
目录一、深拷贝与浅拷贝解析浅拷贝...浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化。 1.对于八种基本数据类型说,它们的拷贝是值传递,修改拷贝对象的数
ios提供了copy和mutablecopy方法,顾名思义,copy...retain属性表示两个对象地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1也就是说,retain 是指针拷贝,copy 是内容拷贝。 当然在iOS中并
在任何地方对此对象属性 的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。 序号 方 法 说 明 1 Object getAttribute(String name) 返回给...
(2)定义一个简单的Computer类,有数据成员芯片(CPU),内存(ram),光驱(cdrom)等等,有两个公有成员函数run、stopo,CPU为CPU类的一个对象,ram为RAM类的一个对象,cdrom为CDROM类的一个对象,定义并实现这个类。...
共有3 次new Person(),所以会在堆里面开辟3 个空间,产生3 个实例对象,每个对象之间都是相 互独立的,使用自己的空间,在PHP 里面,只要有一个new 这个关键字出现就会实例化出来一个对 象,在堆里面开辟一块自己的...
按以下描述和要求建立两个类:基类 Rectangle(矩形类) 和派生类 Cube(正方体) 1. Rectangle 私有成员: double x1, y1; //左下角的坐标 double x2, y2; //右上角的坐标 公有成员: 带缺省值的构造...
有时需要用到多个完全相同的对象,例如,同一型号的每一个产品从外表到内部属性都是一样的,如果要对每一个产品分别进行处理,就需要建立多个同样的对象,并要进行相同的初始化,用以前的办法定义对象(同时初始化)...
1.设计一个学生类Student。 1)数据成员包括: 学生学号、姓名、数学、英语、c语言成绩;(用字符指针存储学号和姓名,通过动态存储空间分配的方式为指针开辟指向的空间,保证空间大小没有浪费) 2)成员函数包括: 设置...
概述 原型模式是指原型实例指向创建对象的种类,并通过拷贝这些原型创建新的对象,是一种用来创建对象的模式,也就是创建一个对象作为另一个对象的prototype属性; prototype警告:学习了解原型模式前需先学习...
属性是对一个对象状态的描述,如“在馆图书类”,从流通管理的角度来看,应包含书名Title、作者名Author、分类号IndexCode、册数Number、条码号BarCode等属性。 其它类的属性如下: 读者类,包含姓名Name、职务...
}这个对象,想要复制对象obj1,一贯的做法就是obj2 = obj1,这时虽然obj2拥有了obj1的所有属性,但obj2却不是自由的,因为它的改动会影响到obj1,obj1的改动也会影响到obj2,这不是我们所希望的,所以要用到深拷贝和...
2.设计并测试一个名为Rectangle的矩形类,其属性为矩形的左下角和右上角两个点的坐标,有成员函数能计算矩形的面积。 3.定义一个CPU类,包含等级、频率,电压等属性,并编写构造函数、析构函数,以及成员函数run、...
矩阵相加的函数,实现两个矩阵相加的功能,结果保存在另一个矩阵类,但必须矩阵大小相同; 矩阵相减的函数,实现两个矩阵相减的功能,结果保存在另一个矩阵类,但必须矩阵大小相同。 (3) 定义三个矩阵:A1、A2、A3...