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) .对私 ...
随机推荐
- (转)iptables简介
iptables简介 原文:https://www.cnblogs.com/metoy/p/4320813.html netfilter/iptables(简称为iptables)组成Linux平台下 ...
- Spring Aware
spring依赖注入的最大亮点就是所有的bean感知不到spring容器的存在,但在实际开发中,我们不可避免的要用到spring容器本身的功能资源,这时,我们就必须意识到容器的存在(废话,都要跟容器进 ...
- DedeCms中Channel用typeid无效
DedeCms中channel 用typeid调用无法达目的吗?请换成type试试! {dede:channel type='son' typeid='19' row='1'} <a href= ...
- (初学)wpf仿QQ界面-整体布局
跟一个小学弟一起学习wpf,小学弟是刚初中毕业,对编程刚刚接触,我挺怕自己带的不好,影响小学弟以后在编程方向的学习兴趣.我承认自己水平不高,但是在努力去学习新知识!一起加油吧!在此以博客,记录学习进度 ...
- Java入门之JDK安装及环境变量配置
一.安装JDK 安装过程中会出现两次安装提示 .第一次是安装 jdk ,第二次是安装 jre .建议两个都安装在同一个java文件夹中的不同文件夹中. (注:若无安装目录要求,可全默认设置.无需做任何 ...
- 基于HTTP协议之WEB消息实时推送技术原理及实现
很早就想写一些关于网页消息实时推送技术方面的文章,但是由于最近实在忙,没有时间去写文章.本文主要讲解基于 HTTP1.1 协议的 WEB 推送的技术原理及实现.本人曾经在工作的时候也有做过一些用到网页 ...
- intellijidea课程 intellijidea神器使用技巧 3-2 livetemplate
创建livetemplate分组: ctrl shift a ==> live templates ==> + ==> templates group 创建livetemplate模 ...
- Android自定义控件 -- 带边框的TextView
使用xml实现边框 原来使用带边框的TextView时一般都是用XML定义来完成,在drawable目录中定义如下所示的xml文件: <?xml version="1.0" ...
- Struts1.x 用户登录模块的实现
页面验证部分: <%@ page language="java" contentType="text/html; charset=UTF-8" pageE ...
- 怎样解决putty终端乱码的方法
原文地址:https://jingyan.baidu.com/article/3aed632e5f00ae701080913a.html?qq-pf-to=pcqq.c2c 终端输入:echo $LA ...