表单提交这个方法是挺方便的,但在java来说就显得有些麻烦了,

怎么个麻烦呢,就是当你字段多的时候,你就得一个一个的获取其对应的值,这样代码量就多了起来,其代码量不说,维护也是一个问题。

所以就有了这样一个类,只需把request和实体类对象传进去就行了,

这样就会得到一个有值的实体类对象

下面是代码示例

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.sql.Date;

import java.sql.Timestamp;

import java.text.SimpleDateFormat;

import javax.servlet.http.HttpServletRequest;

public class RequestHelper {

/**

* 把request请求的数据放到java对象中

*/

public static T getSingleRequest(HttpServletRequest request, Class obj) {

//创建实例

T instance = null;

try {

//获取类中声明的所有字段

Field[] fields = obj.getDeclaredFields();

//创建新的实例对象

instance = obj.newInstance();

//利用循环

for (int i = 0; i < fields.length; i++) {

//获取字段的名称

String name = fields[i].getName();

//把序列化id筛选掉

if (name.equals("serialVersionUID")) {

continue;

}

//获取字段的类型

Class> type = obj.getDeclaredField(name).getType();

// 首字母大写

String replace = name.substring(0, 1).toUpperCase()

+ name.substring(1);

//获得setter方法

Method setMethod = obj.getMethod("set" + replace, type);

//获取到form表单的所有值

String str = request.getParameter(replace);

if (str == null || "".equals(str)) {

// 首字母小写

String small = name.substring(0, 1).toLowerCase()

+ name.substring(1);

str = request.getParameter(small);

}

//通过setter方法赋值给对应的成员变量

if (str != null && !"".equals(str)) {

// ---判断读取数据的类型

if (type.isAssignableFrom(String.class)) {

setMethod.invoke(instance, str);

} else if (type.isAssignableFrom(int.class)

|| type.isAssignableFrom(Integer.class)) {

setMethod.invoke(instance, Integer.parseInt(str));

} else if (type.isAssignableFrom(Double.class)

|| type.isAssignableFrom(double.class)) {

setMethod.invoke(instance, Double.parseDouble(str));

} else if (type.isAssignableFrom(Boolean.class)

|| type.isAssignableFrom(boolean.class)) {

setMethod.invoke(instance, Boolean.parseBoolean(str));

} else if (type.isAssignableFrom(Date.class)) {

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

setMethod.invoke(instance, dateFormat.parse(str));

} else if (type.isAssignableFrom(Timestamp.class)) {

SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

setMethod.invoke(instance, new Timestamp(dateFormat.parse(str).getTime()));

}

}

}

} catch (Exception e) {

// TODO: handle exception

e.printStackTrace();

}

//返回实体类对象

return instance;

}

}

补充知识:java反射对实体类取值和赋值,可以写成通过实体类获取其他元素的数据,很方便哦~~~

项目中需要过滤前面表单页面中传过来的实体类的中的String类型变量的前后空格过滤,由于前几天看过一个其他技术博客的的java反射讲解,非常受益。于是,哈哈哈

public static void modelTrim(T model){

Class clazz = (Class) model.getClass();

//获取所有的bean中所有的成员变量

Field[] fields = clazz.getDeclaredFields();

for(int j=0;j

//获取所有的bean中变量类型为String的变量

if("String".equals(fields[j].getType().getSimpleName())){

try {

//获取get方法名

String methodName = "get"+fields[j].getName().substring(0, 1).toUpperCase()

+fields[j].getName().replaceFirst("\\w", "");

Method getMethod = clazz.getDeclaredMethod(methodName);

//打破封装

getMethod.setAccessible(true);

//得到该方法的值

Object methodValue = getMethod.invoke(model);

//判断值是否为空或者为null,非的话这过滤前后空格

if(methodValue != null && !"".equals(methodValue)){

//获取set方法名

String setMethodName = "set"+fields[j].getName().substring(0, 1).toUpperCase()

+fields[j].getName().replaceFirst("\\w", "");

//得到get方法的Method对象,带参数

Method setMethod = clazz.getDeclaredMethod(setMethodName,fields[j].getType());

setMethod.setAccessible(true);

//赋值

setMethod.invoke(model, (Object)String.valueOf(methodValue).trim());

}

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (SecurityException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

}

}

}

亲自上面试用是好使的

下面还有一套,通过request,和实体类来封装本人还未实验,以后有机会再试试

/**

* 保存数据

*@param request

*@param dto

*@throws Exception

*/

public static void setDTOValue(HttpServletRequest request, Object dto) throws Exception {

if ((dto == null) || (request == null))

return;

//得到类中所有的方法 基本上都是set和get方法

Method[] methods = dto.getClass().getMethods();

for (int i = 0; i < methods.length; i++) {

try {

//方法名

String methodName = methods[i].getName();

//方法参数的类型

Class[] type = methods[i].getParameterTypes();

//当时set方法时,判断依据:setXxxx类型

if ((methodName.length() > 3) && (methodName.startsWith("set")) && (type.length == 1)) {

//将set后面的大写字母转成小写并截取出来

String name = methodName.substring(3, 4).toLowerCase() + methodName.substring(4);

Object objValue = getBindValue(request, name, type[0]);

if (objValue != null) {

Object[] value = { objValue };

invokeMothod(dto, methodName, type, value);

}

}

} catch (Exception ex) {

throw ex;

}

}

}

以上这篇Java 通过反射给实体类赋值操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持聚米学院。

java 反射获取实体类_Java 通过反射给实体类赋值操作相关推荐

  1. java 反射获取修饰符_java之反射和BeanUtils类

    反射和BeanUtils类 1. 类的初始化:类什么什么情况下会加载到内存中 只要类加载到内存中,那么类加载器就会为这个类创建一个class文件对象 2. javaBean:数据库中的表和java中的 ...

  2. java反射 获取参数类型_Java反射带参构造创建对象时如何自动转换参数类型

    需求是这样的:有一个类,类的路径知道,例如是com.xx.xx.xx其中有不同类型的成员变量(个数未知),有对应的setter和getter方法,有一个无参构造和一个全参构造.现在需要用反射机制... ...

  3. java通过反射获取加了某个注解的所有的类

    一.前言 有时候我们会碰到这样的情况: 有n个场景,每个场景都有自己的逻辑,即n个处理逻辑, 这时候我们就需要通过某个参数的值代表这n个场景,然后去加载每个场景不同的bean对象,即不同的类,这些类中 ...

  4. java bean的反射类_JAVA中反射机制五(JavaBean的内省与BeanUtils库)

    内省(Introspector) 是Java 语言对JavaBean类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法 ...

  5. java反射机制是什么_java的反射机制是什么?

    展开全部 Java 的反射机制是使其具有动态特性的32313133353236313431303231363533e4b893e5b19e31333231633263非常关键的一种机制,也是在Java ...

  6. java中反射机制的含义_java的反射是什么意思?

    反射是Java的特征之一,是一种间接操作目标对象的机制. Java反射机制指的是在Java程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法:对于给定的一个对象,都能够调用它的任意一个属 ...

  7. java封装对象实体类_Java 接口自动化系列--实体类之entity封装

    实体包entity下面有4个类,主要存放java对象,每个类必须有私有属性,空参构造,get set方法 具体excel中数据信息见---工具类excel文章 1.API类 解析excel中接口信息的 ...

  8. java servlet 获取路径问题_Java,JSP,Servlet获取当前工程路径(绝对路径)问题解析...

    在jsp和class文件中调用的相对路径不同. 在jsp里,根目录是webroot 在class文件中,根目录是webroot/web-inf/classes 当然你也可以用system.getpro ...

  9. 在java中获取当前时间_JAVA中获取当前系统时间

    一. 获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleDateFormat; public class NowStri ...

最新文章

  1. angular2.0学习日记1
  2. 非线性回归模型(part1)--神经网络
  3. IOS开发基础之网易新闻环境搭建异步请求json,AFN网络封装第1天
  4. mvn install:install-file将本地一个中央仓库没有的jar包,推到本地仓库----所有依赖不上仓库不能用
  5. WdatePicker日历控件使用方法(转)
  6. pythonif有多个条件怎么办,Python if有多个条件怎么办
  7. 进入顶层社会的顺序是什么?
  8. Linux 文件操作
  9. java求生序列_Java 经典面试题:聊一聊 JUC 下的 LinkedBlockingQueue_绝地求生黑号,dnf辅助...
  10. 清华大学829考研 初试436经验谈
  11. Win7下Protel 99 SE SCH库文件和PCB库文件添加问题
  12. python藏头诗_Python简单实现表白藏头诗-Go语言中文社区
  13. 电脑硬件升级完全解决方案
  14. Android studio下载插件失败问题
  15. python抓主力资金_【邢不行|量化小讲堂系列09-Python量化入门】通过逐笔数据计算主力资金流数据...
  16. 【难忘今宵】第一阶段day1打简单代码
  17. u-boot-1.3.4 移植到S3C2440
  18. Spark RDD的分区规则详解
  19. 个人信用报告内容组成和解读(7) ---公共信息明细
  20. Calibre xRC在 RF PDK的使用

热门文章

  1. 音视频技术开发周刊 | 137
  2. 从C++转向最受欢迎的Rust语言
  3. 2 周流量激增百倍的腾讯课堂后台扩容和性能优化实战
  4. FFmpeg 源代码:avcodec_find_encoder()和avcodec_find_encoder_by_name()
  5. DNS support edns-client-subnet
  6. 做WebRTC,千万别把媒体和信令混在一起
  7. kubernetes1.8.4 安装指南 -- 7. kubernetes node安装
  8. go 并发安全map 分段锁实现
  9. 对于多表查询和转账的事务提交
  10. leetcode 219. 存在重复元素 II(规定步长)