/** 判断map里的键名是否等于实体内的某个属性名*/
public static boolean isEquals(String key, Field[] userFields) {
for (int i = 0; i < userFields.length; i++) {
if (key.equals(userFields[i].getName())) {
return true;
}
}
return false;
}
public static Object converMap2Class(Map<String,Object> map,Class<?> clazz)throws Exception{
/** 1.获取反射的类地址*/
String name=clazz.getName();
/** 2.实例化User类对象*/
//使⽤Class类的中静态forName()⽅法获得与字符串相应的Class对象
Class<?> class1=Class.forName(name);
//使用对应类的无参构造方法来创建该类的实例
Object object=class1.newInstance();
/** 3.获得类中的所有属性*/
//获得所有属性(全部类型的修饰符属性均可获得)
Field[] userFields=class1.getDeclaredFields();
/** 4.改变属性类型*/
//将反射对象中的 accessible 标志位设置为 true,就意味着允许客户端拥有超级权限
for (int i=0;i<userFields.length;i++){
userFields[i].setAccessible(true);
}
// keySet是键的集合,Set里的类型是key的类型
// entrySet是键值对的集合,Set里的类型是Map.Entry
/** 通过Map.entrySet遍历循环map集合,如果存在key和User类内属性名相同,则调用setXXX方法,给属性赋值 */
for (Map.Entry<String, Object> entry : map.entrySet()) {
//userFields是一个属性(key)集合,entry是map中的一个key-value对
if (isEquals(entry.getKey(), userFields)) {
/**调用setXXX方法,给属性赋值 */
/** 1.把entry中的key值的首字母大写 */
//xx.substring(0,2)表示取第一个和第二个字符(含头不含尾
//xx.substring(2)表示去掉前两个字符
//toUpperCase() 方法用于把字符串转换为大写
String names = entry.getKey().substring(0, 1).toUpperCase() + entry.getKey().substring(1);
/** 2.把entry中的value值转成String类型 */
String value = entry.getValue().toString();
/** 3.获得class1对象的get××方法
* getMethods(): 获得类的public类型的方法
* getMethod(String name, Class[] params): 获得类的特定方法,name参数指定方法的名字,params参数指定方法的参数类型
* getDeclaredMethods(): 获取类中所有的方法(public、protected、default、private)
* getDeclaredMethod(String name, Class[] params): 获得类的特定方法,name参数指定方法的名字,params参数指定方法的参数类型
* */
Method mo = class1.getMethod("get" + names);
/**类型判断可扩展 */
//Method.getReturnType()方法返回一个Class对象,该对象表示此Method对象表示的方法的正式返回类型。
//Method.getName()方法以字符串形式返回此方法的名称。
if (mo.getReturnType().getName().equals(Integer.class.getName())) {
mo = class1.getMethod("set" + names, Integer.class);
mo.invoke(object, Integer.valueOf(value));
} else if (mo.getReturnType().getName().equals(String.class.getName())) {
mo = class1.getMethod("set" + names, String.class);
mo.invoke(object, value);
} else if (mo.getReturnType().getName().equals(Long.class.getName())) {
mo = class1.getMethod("set" + names, Long.class);
mo.invoke(object, Long.valueOf(value));
} else if (mo.getReturnType().getName().equals(Double.class.getName())) {
mo = class1.getMethod("set" + names, Double.class);
mo.invoke(object, Double.valueOf(value));
} else if (mo.getReturnType().getName().equals(Date.class.getName())) {
mo = class1.getMethod("set" + names, Date.class);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
Date date = new Date(Long.parseLong(value));
String time = format.format(date);
mo.invoke(object, format.parse(time));
} else if (mo.getReturnType().getName().equals(Float.class.getName())) {
mo = class1.getMethod("set" + names, Float.class);
mo.invoke(object, Float.valueOf(value));
}
}
}
return object;
}
public static <T> void setObject(T t, Map map) throws Exception {
//创建class cl
Class cl = t.getClass();
//forEach
//1 .遍历数组内的元素,操作这个数据,然后返回,会改变原数组
//2 .不会返回有意义的值,只是能在循环中处理结果
//3 .forEach()允许callback更改原始数组的元素。map()返回新的数组。
map.forEach((k,v)->{
try {
//key首字母大写
String name = k.toString().substring(0,1).toUpperCase() + k.toString().substring(1);
Method mo = cl.getMethod("get"+name);
//类型判断可扩展
if(mo.getReturnType().getName().equals(Integer.class.getName())){
mo = cl.getMethod("set"+name,Integer.class);
mo.invoke(t,v);
}else if(mo.getReturnType().getName().equals(String.class.getName())){
mo = cl.getMethod("set"+name,String.class);
mo.invoke(t,v);
}else if(mo.getReturnType().getName().equals(Long.class.getName())){
mo = cl.getMethod("set"+name,Long.class);
mo.invoke(t,v);
}else if(mo.getReturnType().getName().equals(Double.class.getName())){
mo = cl.getMethod("set"+name,Double.class);
mo.invoke(t,v);
}else if(mo.getReturnType().getName().equals(Date.class.getName())){
mo = cl.getMethod("set"+name, Date.class);
mo.invoke(t,v);
}else if(mo.getReturnType().getName().equals(Float.class.getName())){
mo = cl.getMethod("set"+name,Float.class);
mo.invoke(t,v);
}
} catch (Exception e) {
System.out.println("当前字段属性:"+k+",不在类中");
e.printStackTrace();
}
});
}
public static Map<String, Object> dataMap(String items) {
//把json对象items转换成hashmap
HashMap hashMap = JSON.parseObject(items, HashMap.class);
String time = null;
Map<String,Object> map =new HashMap<String,Object>();
//for(类型名 对象 : 需要遍历的数组)
//先创建了对象或者变量,然后遍历数组,⼀个⼀个赋值给对象
for(Object key : hashMap.keySet()) {
//JSON.parseObject(String str)是将str转化为相应的JSONObject对象
// 其中str是“键值对”形式的json字符串,转化为JSONObject对象之后就可以使⽤其内置的⽅法,进⾏各种处理了。
//hashmap.get(Object key)返回key对应的value
JSONObject jsonObject=JSONObject.parseObject(hashMap.get(key).toString());
//取value值
String values = jsonObject.get("value").toString();
time = jsonObject.get("time").toString();
map.put(key.toString(),values);
}
map.put("time",time);
return map;
}
MapBean
于 2022-07-06 10:53:32 首次发布