java的method反射机制(二)

依然范特西╮ 提交于 2020-01-12 19:24:31

在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框架了,大家有兴趣的可以去自己研究,如果有什么问题,欢迎大家留言!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!