方法参数:`params`:代表要转换的map集合 `clazz`:代表目标对象的类类型 返回值:T:代表泛型类型,根据输入参数clazz确定目标对象类型 方法逻辑如下:1. 首先实例化目标对象 java Object obj = clazz.newInstance();2. 遍历map集合 对于map集合中的每一个键值对(entry),执行如下操作 java for (...
java中map转对象
将map集合转换为Java对象(Bean)的实现,利用反射技术完成。
方法签名如下:
java
public static T mapToBean(Map map, Class clazz) throws Exception;
方法参数:
`params`:代表要转换的map集合
`clazz`:代表目标对象的类类型
返回值:
T:代表泛型类型,根据输入参数clazz确定目标对象类型
方法逻辑如下:
1. 首先实例化目标对象
java
Object obj = clazz.newInstance();
2. 遍历map集合
对于map集合中的每一个键值对(entry),执行如下操作
java
for (Map.Entry entry : map.entrySet()) {
String propertyName = entry.getKey(); // 属性名
Object value = entry.getValue(); // 属性值
3. 获取属性名对应的属性
java
String setMethodName = "set" + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
Field field = getClassField(clazz, propertyName);
4. 判断属性是否存在,转换属性值类型,设置属性值
java
if (field == null) {
continue;
Class fieldTypeClass = field.getType();
value = convertValType(value, fieldTypeClass);
try {
clazz.getMethod(setMethodName, field.getType()).invoke(obj, value);
} catch (NoSuchMethodException e) {
e.printStackTrace();
5. 结束循环,返回转换后的对象
java
return (T) obj;
方法中还包括了根据给定对象类匹配对象中的特定字段的逻辑:
java
private static Field getClassField(Class clazz, String fieldName) {
if (Object.class.getName().equals(clazz.getName())) {
return null;
Field[] declaredFields = clazz.getDeclaredFields();
for (Field field : declaredFields) {
if (field.getName().equals(fieldName)) {
return field;
Class superClass = clazz.getSuperclass();
if (superClass != null) {
return getClassField(superClass, fieldName);
return null;
方法中还包含了一个将map的value值转为实体类中字段类型匹配的逻辑:
java
private static Object convertValType(Object value, Class fieldTypeClass) {
Object retVal = null;
switch (fieldTypeClass.getName()) {
case "long":
retVal = Long.parseLong(value.toString());
break;
case "int":
retVal = Integer.parseInt(value.toString());
break;
case "float":
retVal = Float.parseFloat(value.toString());
break;
case "double":
retVal = Double.parseDouble(value.toString());
break;
default:
retVal = value;
} return retVal;
}
通过以上步骤,我们可以将map集合中的键值对转换为对应Java对象的属性值,完成数据的映射。这种方法在处理复杂对象关系和属性类型不一致时非常有用。2024-10-06