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


// 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值