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

来源:互联网 发布:office mac 威锋 编辑:程序博客网 时间:2024/06/08 14:37

第一:最最常见的是使用反射来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 0