在java web 开发中,我们经常会遇到,从后台获取前台的值,将获取的值通过set方法赋值给实体,然后将实体存入数据库中,有时候对于实体属性多时,代码量很大(其实都是那些set方法),所以针对这点,我们可以通过method反射机制,写个通用的底层方法(对任何实体都有效),这样一来,我们就不用再去一个一个set到实体中去。
public static Object ObjectMethod(Object obj,HttpServletRequest request){
Field[] fields = obj.getClass().getDeclaredFields();
for(Field field:fields){
String md = "set"+StringUtils.capitalize(field.getName());
try {
Method method = obj.getClass().getDeclaredMethod(md, field.getType());
if("java.lang.String".equals(field.getType().getName())){
String value = request.getParameter(field.getName());
method.invoke(obj, value);
}else if("java.lang.Integer".equals(field.getType().getName())){
if(!"".equals(request.getParameter(field.getName()))&&request.getParameter(field.getName())!=null){
Integer value = Integer.valueOf(request.getParameter(field.getName()));
method.invoke(obj, value);
}
}else{//这里判断当实体中某个属性为对象类型时,再一次去反射
Class c = Class.forName(field.getType().getName());//获取属性所对应的实体类
Object o =c.newInstance(); //new一个实体类
Field[] fs = o.getClass().getDeclaredFields();
for(Field f : fs){
if(f.getName().endsWith("id")){//需要命名规范
String set = "set"+StringUtils.capitalize(f.getName());
Method m = o.getClass().getDeclaredMethod(set, f.getType());
if("java.lang.Integer".equals(f.getType().getName())){
Integer value = Integer.valueOf(request.getParameter(field.getName()));
m.invoke(o, value);
method.invoke(obj, o);
}else if("java.lang.String".equals(field.getType().getName())){
String value = request.getParameter(field.getName());
m.invoke(o, value);
method.invoke(obj, o);
}//今后添加基础类型
}
}
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (InstantiationException e) {
e.printStackTrace();
}
}
return obj;
}
以上两篇文章,是对java Method反射机制的一个认识,其实,我们在java web开发中,所用到的框架,hibernate,spring等,都是通过java method反射机制去写的,由于时间问题,我在这里就不准备用java method的反射机制去模拟 hibernate ,spring框架了,大家有兴趣的可以去自己研究,如果有什么问题,欢迎大家留言!
来源:https://www.cnblogs.com/c-source/archive/2011/12/30/2564938.html