JAVA 中从应用场景中来总结反射的使用

第一:最最常见的是使用反射来get,set;

我们常用的框架:spring mvc,structs,hibernate中就有对反射的很好应用;这里最主要的是把请求中的参数,set进实体中。直接通过实体去调用参数。或者在做保存的时候,使用hibernate可以直接save,或者update进数据库。但是直接update进数据库这里会出现一些问题:会覆盖原有的数据库中存在的数据。最规范的更新是先get,后update;

框架之所以为框架是因为其简化了我们写代码,让那些重复的代码消失。我们如果不使用框架的话,我们从前台拿请求参数,是使用request.getParameter("");如果表单有很多个,譬如说100个,难道还是去写100句吗?这肯定是不好的。所以如果我不用框架,我会自己封装一个方法,来达到将request中的请求中的参数set进我要的实体类。我还要让这个方法对所有的实体类都是有效的,那么就得配合泛型来写了。

这里先写写思路:

1.通过类,拿到这个的所有属性(包括父类),形成一个数组arr[]

2然后写一个根据字段生成的set方法;

3.循环遍历数组,通过request.getParameter("arr[i]")    获取请求传来的值;

4.通过反射将3得到的数据set进方法中。

这样一个类似于spring mvc,或者struts的set进实体的功能便实现了。数据库set进实体类也是同样的原理。

实例代码:

	public static <T> void getInfor(T t, HttpServletRequest request) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException
	{
			Method father[]=t.getClass().getGenericSuperclass().getClass().getMethods();   //取父亲类的方法
			Method son[]=t.getClass().getDeclaredMethods();                                //取当前方法
			Method[] methods=ArrayUtils.addAll(father,son);                                //合并方法
			 
			
			Field sonFil[]=t.getClass().getFields();                                      //当前类字段
			Field fatherFil[]=t.getClass().getGenericSuperclass().getClass().getFields();  //父类字段
			Field[] field=ArrayUtils.addAll(fatherFil,sonFil);                             //合并
			for(int j=0;j<methods.length;j++)                                              //遍历方法
			{
				for(int i=0;i<field.length;i++)                                
				{
					if(methods[j].getName().equals(getFirstCharacterToUpper(field[i].getName())))    //如果方法名称与字段生成的方法名称一样,则从request中拿到值,并且设置值
					{
						methods[j].invoke(t,request.getParameterValues(field[i].getName()));        //反射设置值
						break;
					}
				}
			}
	}

	/*根据字段获得它的set方法*/
	private static String getFirstCharacterToUpper(String srcStr) {
		String setMethod = "set" + StringUtils.capitalize(srcStr); // 首字母大写
		return setMethod;
	}




第二:动态生成表单时,需要从后台把表单的验证规则也带到前台:这里会出现一个问题,就是动态生成表单的name不可以以静态的表单的naem相同,否则动态生成的表单

提交数据,会与原有表单出现冲突。所以得验证表单名称的唯一性。假设我们的表单是录入进数据库,然后根据类别去拿表单。那么载入进数据库的时候就得验证表单的name是不可以和原有的类中的属性同名。所以这里需要根据类的名称去拿该类下的所有属性,然后作对比。



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值