BeanUtils工具的实现

自定义一个将数据映射到类里的方法

方法一:

package utils;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map; /**
* @author: 肖德子裕
* @date: 2018/8/28 21:48
* @description: 数据反射封装工具类
*/
public class BeanUtils {
public static <T> T populate(Class<T> cls, Map<String, Object> map) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
T obj = null; //1、用类反射new出对象
obj = cls.newInstance(); //2 再用类反射对新new的对象设置属性值(必须遵守Java设置规范)--即通过setter方法设置
//2.1遍历出所有该类声明的属性
Field flds[] = cls.getDeclaredFields();//getDeclaredFields()返回Class中所有的字段,包括私有字段;
for (Field fld : flds) {
//获取该fld对象所代表的属性名
String fldName = fld.getName();
//根据属性名,到map中去读取数据,只有数据非空才需要给该属性设置值
Object value = map.get(fldName);
if (value == null) {//如果map中不存在对应的属性数据,我们在这里给出提示信息
System.out.println(fldName + "的数据为空");
} else {
//如果map中存在对应的属性数据,则由属性名得出它的setter方法的名字
String mothodName = "set" + fldName.substring(0, 1).toUpperCase() + fldName.substring(1); //根据方法名和参数的数据类型(其实就是属性的类型),获得Method对象
Class<?> paramTypes[] = new Class[1];
paramTypes[0] = fld.getType();
Method method = cls.getDeclaredMethod(mothodName, paramTypes); //调用该method对象所代表的方法
Object args[] = new Object[1];
args[0] = value;
method.invoke(obj, args);
}
}
return obj;
}
}

方法二:

package utils;

import java.lang.reflect.Field;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map; public class FormUtil { public static Object convert(Map<String, String[]> map, Class<?> clazz) {
Object instance = null;
try {
instance = clazz.newInstance();
for (Field field : clazz.getDeclaredFields()) {
String[] values = map.get(field.getName());
if (values != null) {
Object val = convertValue(field.getType(), values[0]);
field.setAccessible(true);
field.set(instance, val);
}
}
} catch (InstantiationException e) {
throw new RuntimeException(e.getMessage());
} catch (IllegalAccessException e) {
throw new RuntimeException(e.getMessage());
}
return instance;
} private static Object convertValue(Class<?> fieldType, String value) {
Object val = null;
if ("".equals(value) && !fieldType.equals(String.class)) {
throw new RuntimeException("input \"\" can not convert to " + fieldType);
} else if (fieldType.equals(String.class)) {
val = value;
} else if (fieldType.equals(Integer.TYPE) || fieldType.equals(Integer.class)) {
val = Integer.valueOf(value);
} else if (fieldType.equals(Byte.TYPE) || fieldType.equals(Byte.class)) {
val = Byte.valueOf(value);
} else if (fieldType.equals(Short.TYPE) || fieldType.equals(Short.class)) {
val = Short.valueOf(value);
} else if (fieldType.equals(Character.TYPE) || fieldType.equals(Character.class)) {
val = Character.valueOf(value.charAt(0));
} else if (fieldType.equals(Boolean.TYPE) || fieldType.equals(Boolean.class)) {
val = Boolean.valueOf(value);
} else if (fieldType.equals(Long.TYPE) || fieldType.equals(Long.class)) {
val = Long.valueOf(value);
} else if (fieldType.equals(Float.TYPE) || fieldType.equals(Float.class)) {
val = Float.valueOf(value);
} else if (fieldType.equals(Double.TYPE) || fieldType.equals(Double.class)) {
val = Double.valueOf(value);
} else if (fieldType.equals(Date.class)) {
try {
val = new SimpleDateFormat("yyyy-MM-dd").parse(value);
} catch (ParseException e) {
throw new RuntimeException(e.getMessage());
}
}
return val;
}
}

方法三:

package utils;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map; /**
* @author: 肖德子裕
* @date: 2018/8/28 22:22
* @description: 数据反射封装工具类2
*/
public class BeanUtils2 {
public static Object populate(Class cls, Map map) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
Object obj = null; //1、用类反射new出对象
obj = cls.newInstance(); //2 再用类反射对新new的对象设置属性值(必须遵守Java设置规范)--即通过setter方法设置
//2.1遍历出所有该类声明的属性
Field flds[] = cls.getDeclaredFields();//getDeclaredFields()返回Class中所有的字段,包括私有字段;
for (Field fld : flds) {
//获取该fld对象所代表的属性名
String fldName = fld.getName();
//根据属性名,到map中去读取数据,只有数据非空才需要给该属性设置值
Object value = map.get(fldName);
if (value == null) {//如果map中不存在对应的属性数据,我们在这里给出提示信息
System.out.println(fldName + "的数据为空");
} else {
//如果map中存在对应的属性数据,则由属性名得出它的setter方法的名字
String mothodName = "set" + fldName.substring(0, 1).toUpperCase() + fldName.substring(1); //根据方法名和参数的数据类型(其实就是属性的类型),获得Method对象
Class paramTypes[] = new Class[1];
paramTypes[0] = fld.getType();
Method method = cls.getDeclaredMethod(mothodName, paramTypes); //调用该method对象所代表的方法
Object args[] = new Object[1];
args[0] = value;
method.invoke(obj, args);
}
}
return obj;
}
}

最新文章

  1. 转载:移动web开发规范
  2. FMDB 数据库
  3. H3C IRF mad检测
  4. django的序列化
  5. mvc多个按钮的提交方法
  6. (转)数据库获得当前时间getdate()
  7. 菜鸟学Linux命令:ssh命令 远程登录
  8. mac安装nginx
  9. HDU 4662 MU Puzzle 简单找规律
  10. Activity的Launch mode详解 singleTask正解
  11. Tekla Structures 使用类库概览
  12. C++豆知识索引
  13. android入门——UI(6)——ViewPager+Menu+PopupWindow
  14. 基于session 的springMvc 国际化
  15. css3整理-方便查询使用
  16. (一)shell脚本入门
  17. APP安全测评checklist---Android
  18. Payment相关逻辑
  19. Android数据库安全解决方案,使用SQLCipher
  20. OI无关--关于侧边栏

热门文章

  1. 我的2015plan
  2. HDU 5353—— Average——————【贪心+枚举】
  3. vue学习笔记 vue安装
  4. jar包介绍
  5. IT相关术语、缩略词
  6. BOM DOM区别 来源
  7. Java—封装
  8. Eclipse导入web项目后,run列表中没有run on server?
  9. C#多线程Thread
  10. U深度U盘启动盘制作工具怎么用?U深度U盘启动盘制作工具使用教学