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) .对私 ...
随机推荐
- 语文,数学,ps
数学教2课以集合为主. 集合:是指具有某种特定性质的具体的或抽象的对象汇总成的集体,这些对象称为该集合的元素. 特点:确定性给定一个集合,哪些对象是这个集合元素,不允有模棱两可的情况.互用性任何两个元 ...
- log4net 基础
log4net:日志输出工具. 新建工程Log4NetDemo App.config配置如下: <?xml version="1.0" encoding="utf- ...
- Java编译及装载
Java类加载机制 JVM将类加载过程划分为三个步骤:装载.链接和初始化. 装载(Load):装载过程负责找到二进制字节码并加载至JVM中,JVM通过类的全限定名(com.bluedavy. Hell ...
- javaSE练习2——流程控制_2.2
一.假设某员工今年的年薪是30000元,年薪的年增长率6%.编写一个Java应用程序计算该员工10年后的年薪,并统计未来10年(从今年算起)总收入. package com.test; public ...
- Spring cloud微服务 Hystrix熔断器学习教程
以下demo代码:https://github.com/wades2/HystrixtDemo 官网定义:Hystrix是一个延迟容错库.在分布式环境中,许多服务依赖项中的一些不可避免地会失败.Hys ...
- poj 2486 树形DP n选m连续路径
题目连接:http://acm.hust.edu.cn/vjudge/problem/18071 资料连接: http://blog.csdn.net/woshi250hua/article/deta ...
- Spring课程 Spring入门篇 2-1 IOC和bean容器
课程链接: 本节讲了5部分内容,6为项目demo: 1 接口及面向接口编程 2 什么是IOC 3 Spring的bean配置 4 Bean的初始化 5 Demo 自己理解: 1 高层模块和底层模块都依 ...
- C++ Knowledge series 3
Programming language evolves always along with Compiler's evolvement The Semantics of Data The size ...
- ubuntu查看nvidia显卡状态
nvidia-smi 连续查看显卡状态 sudo watch nvidia-smi
- 【JavaScript 封装库】BETA 3.0 测试版发布!
/* 源码作者: 石不易(Louis Shi) 联系方式: http://www.shibuyi.net =============================================== ...