您的位置:首页 > 编程语言 > Java开发

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

2017-01-11 00:03 288 查看
第一:最最常见的是使用反射来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是不可以和原有的类中的属性同名。所以这里需要根据类的名称去拿该类下的所有属性,然后作对比。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: