Java 通过反射给实体类赋值操作

表单提交这个方法是挺方便的,但在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> T getSingleRequest(HttpServletRequest request, Class<T> 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 <T> void modelTrim(T model){
    Class<T> clazz = (Class<T>) model.getClass();
    //获取所有的bean中所有的成员变量
    Field[] fields = clazz.getDeclaredFields();
    for(int j=0;j<fields.length;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 通过反射给实体类赋值操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • JavaBean实体类处理外键过程解析

    数据库中的表在映射为JavaBean的实体类时,实体类的字段名应与数据库表中的字段名一致.那么外键要怎么处理? 1. JavaBean中实体类中不应该出现外键字段,弊端如下 : 如果出现外键对应的字段,那么将会出现一个对象与另一个对象的属性相对应,这将不是面向对象中的对象与对象对应. 单个外键只能存储一个字符串,用处不大 2.外键处理方式 :数据库表中的外键字段应当转换成外键对应的表的对象,也就是JavaBean的实体类不声明外键的字段,而是声明外键对应数据表类的类型.举个例子,如下 : 数据库

  • Java实体类(entity)作用说明

    对java实体类的众多理解: A .就是属性类,通常定义在model层里面 B. 一般的实体类对应一个数据表,其中的属性对应数据表中的字段. 好处: 1.对对象实体的封装,体现OO思想. 2.属性可以对字段定义和状态进行判断和过滤 3.把相关信息用一个实体类封装后,我们在程序中可以把实体类作为参数传递,更加方便. C. 说白了就是为了让程序员在对数据库操作的时候不用写SQL语句 D. 就是一个数据库表生成一个类 这样做对数据库操作起来方便 编写代码较少 提高效率 可以使程序员专注逻辑关系 E.

  • java中实体类和JSON对象之间相互转化

    在需要用到JSON对象封装数据的时候,往往会写很多代码,也有很多复制粘贴,为了用POJO的思想我们可以装JSON转化为实体对象进行操作 package myUtil; import java.io.IOException; import myProject.Student; import myProject.StudentList; import org.codehaus.jackson.map.ObjectMapper; import org.json.JSONArray; import or

  • Java 通过反射给实体类赋值操作

    表单提交这个方法是挺方便的,但在java来说就显得有些麻烦了, 怎么个麻烦呢,就是当你字段多的时候,你就得一个一个的获取其对应的值,这样代码量就多了起来,其代码量不说,维护也是一个问题. 所以就有了这样一个类,只需把request和实体类对象传进去就行了, 这样就会得到一个有值的实体类对象 下面是代码示例 import java.lang.reflect.Field; import java.lang.reflect.Method; import java.sql.Date; import ja

  • java中map与实体类的相互转换操作

    java中map与实体类的相互转换 1. 在 pom.xml 中引入依赖包 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.54</version> </dependency> 2. 在控制类中引入 import com.alibaba.fastjson.JSON; 3. 类型转

  • 利用JAVA反射,读取数据库表名,自动生成对应实体类的操作

    本代码是利用java反射,读取数据库表自动根据表名生成实体类,数据库采用老牌SQLSERVER 2000,驱动为JTDS,其他数据库可根据情况自定修改. 代码中包含了大部分数据库类型与JAVA类型的转换,少数未包含进去的会在生成代码时打印出来,方面后期查找修改. import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.sq

  • java反射遍历实体类属性和类型,并赋值和获取值的简单方法

    实例如下: import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Date; /** * 获取实体类型的属性名和类型 * @param model 为实体类 * @author kou 为传入参数 */ public class GetModelNameAndType { public

  • Java利用反射实现文件的读取操作

    java反射 java从很早的版本开始就引入了反射机制,java如今的框架底层大部分也都是使用反射实现的. 这篇博客就去探索下java反射使用的方便之处. 要说java的反射机制,肯定离不开Class这个类,我们从jdk的源码可以看到这个类在jdk1.0的时候就存在了. 由于我这边需要用到文件读写的功能,同时又希望写的方法相对来说比较抽象,能在多出直接使用,于是我就想到了java的反射机制. 首先这边先把我的读取文件的方法展示出来 这个是用到的接口类 /** * 实现该接口中的方法,本来打算在F

  • Java利用反射实现框架类的方法实例

    框架类的简单实现 实现步骤: 1. 加载配置文件 2. 获取配置文件中定义的数据 3. 加载该类进内存 主要讲解第一步:加载配置文件 的相关知识. //1.加载配置文件 //1.1创建Properties对象 Properties pro = new Properties(); //1.2加载配置文件,转换为一个集合 //1.2.1获取class目录下的配置文件 ClassLoader classLoader = ReflectTest.class.getClassLoader(); Input

  • Java通过反射来打印类的方法实现

    目录 一. 案例出发 二. 反射方法的分析 2.1 反射的方式 2.2 修饰符的打印 2.3 getDeclaredxxx和getxxx的区别 2.4 getSimpleName和getName有什么不同 工作了有一段时间了,我觉得是时候去复习下Java的一些基础知识,因此写下了这篇文章.平常开发过程中,前端写的比较多,后端也不能忘! 一. 案例出发 先准备一个模板类: public class User { public int id; private String name; public

  • java技巧:反射判断field类型的操作

    JAVA 反射机制中,Field的getModifiers()方法返回int类型值表示该字段的修饰符. 其中,该修饰符是java.lang.reflect.Modifier的静态属性. 对应表如下: //判断是不是private类型方法 public static boolean is Private(int modifiers){ retrurn ((modifiers & 0x2)!=0); } 分析一下,&是按位与操作符,0x2是十六进制,二进制是10,所以只有private类型按位

  • 新的Java访问mysql数据库工具类的操作代码

    这是之前软工课设我写的java访问mysql工具类,它经过了多轮的测试,应该能够适应大多数的操作需求.比之前大二写的更鲁棒,更易用. package util; import java.lang.reflect.Field; import java.sql.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.

  • 如何实现Java的ArrayList经典实体类

    ArrayList是Java集合框架中一个经典的实现类.他比起常用的数组而言,明显的优点在于,可以随意的添加和删除元素而不需考虑数组的大小.处于练手的目的,实现一个简单的ArrayList,并且把实现的过程在此记录. 实现的ArrayList主要的功能如下: 默认构造器和一个参数的有参构造器 add方法 get方法 indexOf方法 contains方法 size方法 isEmpty方法 remove方法 sort方法 这个简单的ArrayList类 取名为SimpleArrayList,全部

随机推荐