package com.yaofande.utils;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.text.SimpleDateFormat;
import java.util.*;
public class MyBeanUtils {
/**
* 通过内省将map封装为bean,主要用于封装前台传过来的数据,将其封装为java bean对象
*/
public static void populate(Object obj, Map<String,String[]> map) {
Set<String> keySet = map.keySet();
Class<?> clazz = obj.getClass();
keySet.forEach(key -> {
try {
//得到属性描述器
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(key, clazz);
//得到该属性的类型
String s = propertyDescriptor.getPropertyType().toString();
//得到概述性的setter方法
Method writeMethod = propertyDescriptor.getWriteMethod();
//判断属性的类型,然后传入相对应的类型值
if(s.equals("class java.lang.String")) {
writeMethod.invoke(obj, map.get(key)[0]);
} else if(s.equals("class java.lang.Integer")) {
writeMethod.invoke(obj, Integer.valueOf( map.get(key)[0]));
} else if(s.equals("interface java.util.List")) {
/*
这一部分是通过反射得到list集合的泛型,因为不知道用泛型怎么实现,所以用了反射
*/
Field declaredField = clazz.getDeclaredField(key);
ParameterizedType genericType = (ParameterizedType)declaredField.getGenericType();
String s1 = genericType.getActualTypeArguments()[0].toString();
String[] values = map.get(key);
/*
通过比较泛型的类型,给list集合传入对象泛型的值
*/
if(s1.equals("class java.lang.String")) {
List<String> list = new ArrayList<>();
for (String value : values) {
Collections.addAll(list, value);
}
writeMethod.invoke(obj,list);
} else if(s1.equals("class java.lang.Integer")) {
List<Integer> list = new ArrayList<>();
for (String value : values) {
Collections.addAll(list, Integer.parseInt(value));
}
writeMethod.invoke(obj,list);
}
} else if(s.equals("class java.util.Date")) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
Date date = simpleDateFormat.parse(map.get(key)[0]);
writeMethod.invoke(obj,date);
}
} catch (Exception e) {
e.printStackTrace();
}
});
}
}