BeanUtils源码分析及其使用

版权声明:@wrial https://blog.csdn.net/qq_42605968/article/details/86584166

在文章开头我还得回想回想我当时从前台接收数据的艰辛历程,一行行的get
Parameter看这都心里犯狠,这些没有任何技术含量的事要做这么多遍,后来呢我就发现了getParameterMap这个API(有点尴尬),就自己写了个遍历的工具类,但是故事并不是这么完美的,因为我要new 一个bean给它赋值,然后我就又开始了我的艰辛历程了(说多了都是泪),我当时就在想有没有什么方法让我从这解放出来呢(当时可不太懂这个怎么写),放寒假了就圆圆我当时的梦想吧哈哈毕竟以后用的地方还多着勒。

还是老规矩对它先进行一顿原理分析:
1.先用增强的for把全部的键值对遍历出来,注意Value要用数组来装,因为如果是多选的话一个肯定是不够的。
2.利用反射拿到bean的所有	方法,和第一步取出来的keyset比对,如果一样的话就调用set方法
3.如果数据类型是日期类型,要转化为标准的日期类型,否则会报错,我的调试如下(这一步不能固定在方法里,因为日期类型的分隔符不确定)

我开始实现的时候没注意Date类型的数据导致出错
这个是没有时间类型的,运行结果如下是正确的
在这里插入图片描述
这个是有时间类型的,会报错,那么怎么解决呢
在这里插入图片描述

然后我加上了时间转换器,但是还是这个错误,然后我仔细观察了下错误,然后发现是我的bean里的Date导包导错了,要是util下的Data。下边就是我成功的图片
在这里插入图片描述

在这里插入图片描述

实现方式
1.传入参数obj,可以将bean对象传进去,利用Date包创建一个时间转换器再用beannutils下的convertutil注册,然后调用beanutil的populate方法

public static void populate(Object obj, Map<String, String[]> map) {
		try {
			// 手动向BeanUtils注册一个时间类型转换器
			// 创建时间类型的转换器
			DateConverter dt = new DateConverter();
			// 设置转换的格式
			dt.setPattern("yyyy-MM-dd");
			// 注册转换器
			ConvertUtils.register(dt, java.util.Date.class);
			BeanUtils.populate(obj, map);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

2.传入bean的类,利用反射获取到bean对象,利用泛型实现bean的反射对象的返回,到这不得不说反射是真的强大啊,只有隐式的和无参的才能用newInstence()

public static<T> T  populate(Class<T> clazz, Map<String, String[]> map) {
		try {
			
			T obj=clazz.newInstance();
			//手动向BeanUtils注册一个时间类型转换器
			// 1_创建时间类型的转换器
			DateConverter dt = new DateConverter();
			// 2_设置转换的格式
			dt.setPattern("yyyy-MM-dd");
			// 3_注册转换器
			ConvertUtils.register(dt, java.util.Date.class);
			BeanUtils.populate(obj, map);
			return obj;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}		
	}

恭喜你看到了最后,相信你收获一定很多吧哈哈,满满的干货,准备周全才能在开发中有更好的游戏体验不是嘛。圆梦了圆梦了哈哈。

猜你喜欢

转载自blog.csdn.net/qq_42605968/article/details/86584166
今日推荐