对象转换
对象列表转换
属性拷贝, 当且仅当两个对象的非静态属性名称相同且对应的属性类型也相同时才进行属性值拷贝
将对象转换为散列表Object---Map
将list
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.*;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
/**
* @Auther: cjw
* @Date: 2016/7/18 17:22
* @Description: bean 工具类
*/
public class BeanUtil {
private static WriteLock lock = new ReentrantReadWriteLock().writeLock();
private static final Map, Map> METADATA = new HashMap<>();
/**
* 对象转换
*
* @param source
* 源对象
* @param targetClass
* 目标类
* @return 返回一个新的目标类对象, 该目标类对象的属性值从源对象中拷贝而来
*/
public static T convert(Object source, Class targetClass) {
T target = newInstance(targetClass);
copyProperties(source, target);
return target;
}
/**
* 对象列表转换
*
* @param sources
* 源对象列表
* @param targetClass
* 目标类
* @return 返回一个新的目标对象列表, 每个目标类对象的属性值从源对象中拷贝而来
*/
public static List convert(Collection> sources, Class targetClass) {
List targets = new ArrayList();
if (sources != null && sources.size() > 0) {
for (Object source : sources) {
targets.add(convert(source, targetClass));
}
}
return targets;
}
/**
* 属性拷贝, 当且仅当两个对象的非静态属性名称相同且对应的属性类型也相同时才进行属性值拷贝
*
* @param source
* 源对象
* @param target
* 目标对象
*/
public static void copyProperties(Object source, Object target) {
copyProperties(source, target, true);
}
/**
* 属性拷贝, 当且仅当两个对象的非静态属性名称相同且对应的属性类型也相同时才进行属性值拷贝
*
* @param source
* 源对象
* @param target
* 目标对象
* @param copyNullProperty
* 是否拷贝null属性值
*/
public static void copyProperties(Object source, Object target, boolean copyNullProperty) {
if (source == null) {
return ;
}
Class> sourceClass = source.getClass();
Class> targetClass = target.getClass();
Map targetFields = getFieldsMap(targetClass, FieldType.NOT_STATIC);
Map sourceFields = getFieldsMap(sourceClass, FieldType.NOT_STATIC);
for (String name : targetFields.keySet()) {
if (sourceFields.containsKey(name)) {
Field sourceField = sourceFields.get(name);
Field targetField = targetFields.get(name);
if (targetField.getType() == sourceField.getType()) {
Object value = getPropertyValue(source, sourceField);
if (value == null && !copyNullProperty) {
continue ;
}
setPropertyValue(target, targetField, value);
}
}
}
}
/**
* 创建类的一个实例
*
* @param beanClass
* 类
*/
public static T newInstance(Class beanClass) {
try {
return beanClass.newInstance();
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
/**
* 设置对象属性的值
*
* @param bean
* 目标对象
* @param field
* 属性名称
* @param propertyValue
* 属性的值
*/
public static void setPropertyValue(Object bean, Field field, Object propertyValue) {
try {
field.set(bean, propertyValue);
} catch (Throwable e) {
throw new RuntimeException(bean.getClass().getName() + " " + field.getName() + " " + propertyValue, e);
}
}
/**
* 获取目标属性的值
*
* @param bean
* 目标对象
* @param field
* 属性名称
* @return
*/
@SuppressWarnings("unchecked")
public static T getPropertyValue(Object bean, Field field) {
try {
return (T) field.get(bean);
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
/**
* 设置属性的值
*
* @param bean
* 对象或类
* @param property
* 类属性或对象属性名称
* @param propertyValue
* 属性的值
*/
public static void setPropertyValue(Object bean, String property, Object propertyValue) {
if (bean != null) {
Class> beanClass = null;
if (bean instanceof Class) {
beanClass = (Class>) bean;
} else {
beanClass = bean.getClass();
}
Field field = getFieldsMap(beanClass, FieldType.ALL).get(property);
if (field != null) {
setPropertyValue(bean, field, propertyValue);
}
}
}
/**
* 获取属性的值
*
* @param bean
* 对象或类
* @param property
* 类属性名称或对象属性名称
* @return
*/
public static T getPropertyValue(Object bean, String property) {
if (bean != null) {
Class> beanClass = null;
if (bean instanceof Class) {
beanClass = (Class>) bean;
} else {
beanClass = bean.getClass();
}
Field field = getFieldsMap(beanClass, FieldType.ALL).get(property);
if (field != null) {
return getPropertyValue(bean, field);
}
}
return null;
}
/**
* 获取属性的类型
*
* @param bean
* 对象或类
* @param property
* 类属性名称或对象属性名称
* @return
*/
public static Class> getPropertyType(Object bean, String property) {
if (bean != null) {
Class> beanClass = null;
if (bean instanceof Class) {
beanClass = (Class>) bean;
} else {
beanClass = bean.getClass();
}
Field field = getFieldsMap(beanClass, FieldType.ALL).get(property);
if (field != null) {
return field.getType();
}
}
return null;
}
/**
* 将对象转换为散列表
*
* @param source
* 源对象
* @return
*/
public static Map convertMap(Object source) {
return convertMap(source, true);
}
/**
* 将对象转换为散列表
*
* @param source
* 源对象
* @param convertNullProperty
* 空属性是否转换
* @return
*/
public static Map convertMap(Object source, boolean convertNullProperty) {
Map map = new HashMap();
if (source != null) {
Map sourceFields = getFieldsMap(source.getClass(), FieldType.NOT_STATIC);
for (String name : sourceFields.keySet()) {
Object value = getPropertyValue(source, sourceFields.get(name));
if (value == null && !convertNullProperty) {
continue ;
} else {
map.put(name, value);
}
}
}
return map;
}
/**
* 将list