没理解反射的看这篇文章:
1.用反射封装JavaBean的原因
在我们之前使用web做一个简单的增删改查的项目时,他们的业务往往都是从前台拿到数据,然后表单提交到servlet后台,去使用service处理业务,并且用dao去访问数据库,但是每次后台都要一个个地拿到前台地数据并且进行实例化,填充到对象里赋值,那如果这个业务中有很多个对象呢?所以可以利用反射的机制将对象封装(不管你是那个对象我都可以进行封装赋值,即减少重复代码又简洁)。
没封装之前的效果
获取值,填充对象,繁琐
2.封装思路
1.新建一个BeanUntils类,专门用来使用反射封装对象的一个工具类。
2.接收req的参数名称
3.根据参数名称获取值
4.拼接get/set方法名称并根据class实例提供的方法获取参数类型
5.获取class的方法根据名称和参数
6.使用invoke调用方法并赋值
3.BeanUntils类的代码实现
/**
* 利用反射获取并封装数据创建实例
*
* @return 返回对象
*/
public Object parseRequest(HttpServletRequest request, Object obj) {
try {
request.setCharacterEncoding("utf8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
//1.获取数据
Enumeration<String> parameterNames = request.getParameterNames();
Class objClass = obj.getClass();
Object o = null;
try {
//2.创建实例
o = objClass.newInstance();
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
//3.循环遍历参数名称并设置方法,值
while (parameterNames.hasMoreElements()) {
//获取参数名称
String name = parameterNames.nextElement();
//根据名称获取参数值
String value = request.getParameter(name);
try {
//拼接方法赋值:第一个字母转为大写
String setMethod = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
String getMethod = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
//获取无参构造函数
Method method = objClass.getMethod(getMethod);
Method declaredMethod = null;
//获取方法类型
Class<?> returnType = method.getReturnType();
try {
//获取方法信息
declaredMethod = objClass.getDeclaredMethod(setMethod, returnType);
switch (method.getReturnType().getSimpleName()) {
case "int":
declaredMethod.invoke(o, Integer.parseInt(value));
break;
case "String":
declaredMethod.invoke(o, value);
break;
case "float":
declaredMethod.invoke(o, Float.parseFloat(value));
break;
case "double":
declaredMethod.invoke(o, Double.parseDouble(value));
case "long":
declaredMethod.invoke(o, Long.parseLong(value));
break;
}
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}
}
return o;
}
3.1前台获取代码
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cat cat=new Cat();
//调用封装的javaBean方法
Object o = beanUntils.parseRequest(req, cat);
Cat cat1= (Cat) o;
//调用service处理增加业务
int result= catService.addCatService(cat1);
if(result>0)
{
//只用于测试: 输出
System.out.println("增加成功");
}else
{
System.out.println("增加失败");
}
}