通过反射将request中的参数封装到对象中
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.*; /**
* @author:yc
* @date 2018/07/13 20:14
* @Description:
*/
public class ReflectUtil {
private static Map<Class, MyConvert> classMyConvertMap = new HashMap<>(); public static void registConvert(Class clazz, MyConvert convert) {
classMyConvertMap.put(clazz, convert);
}
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd"); /**
* 当前方法的作用是将request中的参数封装到对象中
*/
public static <T> T convertData(Map<String, String[]> map, Class<T> clazz) throws Exception {
//HttpServletRequest re;
//Map<String, String[]> map = re.getParameterMap();
//最终的目的是将map中的数据封装到clazz对应的类型对象上面,然后返回
T newInstance = clazz.newInstance();
//解析参数
//获取到每个参数的名字,然后将这个参数对应的值封装到这个对象上面的对应的属性上面
//1要求 form表单中的参数的名字必须和对象上面的属性名一致
Set<Map.Entry<String, String[]>> entrySet = map.entrySet();//获取到所有参数的键值对,而且这个的键就是参数的名字,也就是是对象上面对应的属性名 for (Map.Entry<String, String[]> entry : entrySet) {
//获取到key
String key = entry.getKey();
System.out.println("当前正在封装:" + key);
//根据key去找刚才我们用于封装参数的对象上面的与key的值一样的属性名
PropertyDescriptor descriptor = new PropertyDescriptor(key, clazz);
if (descriptor != null) {
//获取到set方法
Method writeMethod = descriptor.getWriteMethod();
//调用set方法,然后将这个key对应的值设置进去,那么就到了对象上面
//entry.getValue() form 表单中传递过来的与key对应的具体值,我们需要设置给对象
String[] value = entry.getValue(); //为了保证参数的长度或者类型是匹配的,我们需要将form表单传递过来的数据 转换成为对象setter方法相对应的参数类型
//获取setter的方法的参数类型 Class<?>[] parameterTypes = writeMethod.getParameterTypes(); //进行参数类型转换
if (parameterTypes.length >= 1) {
Class<?> type = parameterTypes[0];//获取到参数的类型,是一个Class
if (type == int.class || type == Integer.class) {
if (value == null || value.length != 1) {
throw new RuntimeException("参数:" + key + "的长度必须为1");
} else {
int parseInt = Integer.parseInt(value[0]);//[18,23,34] int age =18;
writeMethod.invoke(newInstance, parseInt);
}
} else if (type == String.class) {
if (value != null) {
writeMethod.invoke(newInstance, Arrays.toString(value).replace("[", "").replace("]", ""));
}
} else if (type == String[].class) {
//数组类型会抛出长度异常
//java反射规范中,数组参数的传递需要进行转换,转换为object[]
/* String[] strings = new String[value.length];
for (int i = 0; i < value.length; i++) {
strings[i]=value[i];
}
writeMethod.invoke(newInstance,strings);*/
writeMethod.invoke(newInstance, new Object[]{value});
} else if (type == int[].class || type == Integer[].class) {
//writeMethod.invoke(newInstance,new Object[]{value});
int[] ints = new int[value.length];
for (int i = 0; i < value.length; i++) {
ints[i] = Integer.parseInt(value[i]);
}
//如果是在这里手动new的对象,可以不用再转换为object[]
writeMethod.invoke(newInstance, ints);
} else if (type == Date.class || type == java.sql.Date.class) {
if (value == null || value.length != 1) {
throw new RuntimeException("参数:" + key + "的长度必须为1");
} else {
MyConvert convert = classMyConvertMap.get(type);
if (convert != null) {
Object o = convert.convert(value[0]);
writeMethod.invoke(newInstance, o);
} else {
Date date = simpleDateFormat.parse(value[0]);
writeMethod.invoke(newInstance, date);
}
}
} else {//如果是其他的我们不知道的类型,请自己提供转换器转换
MyConvert convert = classMyConvertMap.get(type);//获取当前类型的转换器器
if (convert != null) {
Object o = convert.convert(value);//对数据进行转换
writeMethod.invoke(newInstance, o);
}
}
}
}
}
//返回带有数据的对象,也就是我们创建的对象
return newInstance;
}
}
通过反射将request中的参数封装到对象中的更多相关文章
- 获取url中的参数并以对象的形式展示出来
速记:获取url中的参数并以对象的形式展示出来 function getUrlData(){ let url=window.location.search;//url中?之后的部分 console.l ...
- (八)Struts2中的参数封装
一.静态参数封装 什么是静态参数? 静态参数就是硬编码的,不可随意改变. 例子: (1)我们首先创建一个Action类,里面有两个参数,用来封装请求参数 public class User exten ...
- 将Map中的参数封装为XML
public String packageYDImageUploadXML(String versionCode, Map parmsMap) throws ParseException { Docu ...
- Spring 将请求参数封装成对象
简单描述:最近手里的模块,前后台之间需要传递很多的参数,使用封装的PageData,来获取请求参数的,作微服务迁移的时候,就涉及到需要把参数从pagedata里取出来,一个一个的放到对象的属性中.就很 ...
- 05_XML的解析_02_dom4j 解析将信息封装到对象中
[person.xml]要解析的内容 <?xml version="1.0" encoding="UTF-8"?> <students> ...
- 解析XML并将信息封装到对象中
[person.xml]要解析的内容 <?xml version="1.0" encoding="UTF-8"?> <students> ...
- 将CachedRowSet中的数据转储到对象中
虽然还有很多bug,但凑合能用,就是将CachedRowSet中的数据转换成对象或List.省去了繁琐难看的一系列get/set方法. 先说调用: 注: cachedRowSet是查询的结果集 Stu ...
- springmvc接受前端的参数封装成对象
前端如果传过来的是json格式的字符串,后台参数需要加@RequestBody注解. 前端如果传过来的是json对象,后台不参数需要加@RequestBody注解. $.POST({ url: url ...
- Java读取Txt封装到对象中——(三)
JavaBean package bean; public class Question { private String timu; //题干 private String leixing; //类 ...
随机推荐
- X86-32位架构的CPU是不是内存只能到4G
不是的,可以通过分页机制扩展实现超过4G内存的支持. 什么是分页机制扩展? PAE. 什么是PAE? PAE如何实现的?
- Delphi 的内存操作函数(2): 给数组指针分配内存
静态数组, 在声明时就分配好内存了, 譬如: var arr1: ..] of Char; arr2: ..] of Integer; begin ShowMessageFmt('数组大小 ...
- Spring boot +mybatis 连接mysql数据库,获取JDBC失败,服务器时区价值”Oйu±e×¼e±¼的识别或代表多个时区
报出的错误 Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connec ...
- Java安装及基础01
Java特性: (1)java语言是面向对象的语言 (2)编译一次,到处运行(跨平台) (3)高性能 配置环境变量: JAVA命名规则: (1)常量命名规则:每个字母都大写(POEPLE_PRE_NO ...
- 单机单网卡最大 tcp 长连接数是 65535 吗
在Linux里,如果是作为客户端或者负载均衡器的节点连接多个服务器,在connect()服务器之前, 调用bind()先绑定IP地址(通常是在多网卡的场景),即使使用bind(IP, port=0), ...
- linux驱动调试记录
linux驱动调试 linux 目录 /proc 下面可以配置驱动的调试信息,比如给proc目录的自己定制的驱动的一文件设置一个变量,然后驱动程序跟了proc的参数值来配置调试级别.类似于内核调试的级 ...
- webpack(5) -开发环境
使用 source map (仅用于开发环境) 当 webpack 打包源代码时,可能会很难追踪到 error(错误) 和 warning(警告) 在源代码中的原始位置.例如,如果将三个源文件(a.j ...
- Angular7上手体验
准备工具 Node.js Angular requires Node.js version 8.x or 10.x. 查看当前你的node版本可以在CMD中输入 node -v npm -v 开发工具 ...
- 详解Java内存区域?虚拟机类加载机制?
一.Java运行时数据区域 1.程序计数器 “线程私有”的内存,是一个较小的内存空间,它可以看做当前线程所执行的字节码的行号指示器.Java虚拟机规范中唯一一个没有OutOfMemoryError情况 ...
- 利用FPN构建Faster R-CNN检测
FPN就是所谓的金字塔结构的检测器,(Feature Pyramid Network) 把FPN融合到Faster rcnn中能够很大程度增加检测器对全图信息的认知, 步骤如图所示: 1.先将图像送入 ...