BeanUtils工具的实现
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;
}
}
BeanUtils工具的实现的更多相关文章
- 第13天 JSTL标签、MVC设计模式、BeanUtils工具类
第13天 JSTL标签.MVC设计模式.BeanUtils工具类 目录 1. JSTL的核心标签库使用必须会使用 1 1.1. c:if标签 1 1.2. c:choos ...
- Beanutils工具常用方法
BeanUtils工具是一种方便我们对JavaBean进行操作的工具,是Apache组织下的产品.其主要目的是利用反射机制对JavaBean的属性进行处理. BeanUtils工具一般可以方便ja ...
- BeanUtils工具
什么是BeanUtils工具 BeanUtils工具是一种方便我们对JavaBean进行操作的工具,是Apache组织下的产品. BeanUtils工具一般可以方便javaBean的哪些操作? 1)b ...
- 利用BeanUtils工具类封装表单数据
一.BeanUtils工具类的使用 1.首先导入BeanUtils工具类的jar包 commons-beanutils-1.8.0.jar commons-logging-1.1.1.jar 2.se ...
- BeanUtils 工具类
一.BeanUtils 概述 BeanUtils 是阿帕奇提供的一套专门用于将一些数据封装到java对象中的工具类; 名词:javaBean:特定格式的java类称为java ...
- JavaWeb 之 BeanUtils 工具类
在上一个用户登录案例中,当从浏览器接收参数后,还需要创建 JavaBean 类,对其的属性每一项赋值,如果属性少,可以手动完成,但是当属性非常多,这时就发现非常不方便,在这里提供一个可以封装 Java ...
- JDBC--使用beanutils工具类操作JavaBean
1.在JavaEE中,Java类的属性通过getter,setter来定义: 2.可使用BeanUtils工具包来操作Java类的属性: --Beanutils是由Apache公司开发,能够方便对Be ...
- EL表达式和JSTL(二)——BeanUtils工具
BeanUtils工具 大对数人习惯使用JavaBean的get和set方法来获取和设置JavaBean的属性,但是在Java EE编程的过程中,会经常从配置文件中读取数据,但是从配置文件中读取的数据 ...
- JavaBean 内省API BeanUtils工具 泛型 xml xml约束
1 什么是JavaBean?有何特征? 1)符合特定规则的类 2)JavaBean分二类: a)侠义的JavaBean .私有的字段(Field) .对私 ...
随机推荐
- linux下文件比对功能
很想对吧两个文本有什么不同,可linux下有没有那么方便的工具,怎么办?其实也很简单:diff命令,一行搞定. 新建a.txt文件
- 转:MVC中的文件上传
上传文件与与上传数据区别 上传数据主要指json等简单字符串,上传文件指的是上传word.excel图片等.在上传数据的时候enctype默认为第一个application/x-www-form-ur ...
- sass基础2
- 关于UnitOfWork
按照http://martinfowler.com/eaaCatalog/unitOfWork.html这篇文章的介绍,UnitOfWork是为了维护对象的变化,A Unit of Work keep ...
- maven课程 项目管理利器-maven 3-9 maven依赖冲突 4星
依赖相同的jar包,版本不一致,优先选择哪个版本呢? 1 路径短的优先 如A依赖B,B依赖C,C依赖commons.jar 1.0 A依赖D,D依赖commons.jar 2.0 那么优先解析2.0, ...
- maven课程 项目管理利器-maven 3-8 maven依赖传递 4星
本节主要讲了 1 maven依赖传递 本地项目路径:F:\xiangmu3\Xin\FuQiang\maven\code 2 maven排除依赖 3 注意事项 4 零散知识点 1 maven依赖传递 ...
- intellijidea课程 intellijidea神器使用技巧1-5 idea界面介绍
菜单栏介绍: file:文件操作edit:文本操作view:视图操作navigate:跳转code:源码文件analyze:项目依赖关系分析refactor:代码重构快捷操作,如:抽取函数build: ...
- js 浮点数计算Bug
之前在写项目时候,直接对带小数点的数据进行运算,发现所得到的值并不是自己想要的. 经过一系列学习后,发现在JavaScript中,浮点数运算都是先转换成二进制,在转成二进制的时候有出现无限循环小数,故 ...
- sublime介绍常用插件和快捷键
简介 Sublime Text是由程序员Jon Skinner于2008年1月份所开发出来的,它最初被设计为一个具有丰富扩展功能的Vim. 是一个跨平台的编辑器,同时支持Windows.Linux.M ...
- jquery的html()、text()、val()的区别和用法
1.html() html()[无参]的使用方法是获取某元素内部的HTML代码,包括各种标签: 例:句1:<p>不知道大家高考的理综试卷里有没有关于科学家及其成就的选择题</p> ...