java中的反射小运用

自主项目学习中,从后台往数据库中添加数据,总是重复着获取界面的值,然后在利用实现层来完成对数据库的操作。这样稍觉得有点麻烦,于是做了个小小的笔记,加点印象 , 如下:

//考虑到jsp页面的部分参数列表是:
columns:[[  

        {field:'fid',title:'菜品编号',width:60,align:'center'},  

        {field:'fname',title:'菜品名',width:120,align:'center',editor:"text"},  

        {field:'normprice',title:'原价',width:70,align:'center',editor:"text"},

        {field:'nowprice',title:'折扣价',width:70,align:'center',editor:"text"},

        {field:'fphoto',title:'图片名',width:140,align:'center'},

        {field:'description',title:'描述',width:180,align:'center',editor:"text"},

        {field:'status',title:'上/下架',width:70,align:'center',

            formatter:function(value,rec){

                var a = '<input type="checkbox" class="ck" value="1" >';

                return a;

           }

        },

        {field:'opt',title:'操作',width:200,align:'center',

            formatter:function(value,rec){

                var a = '<a class="editcls1" onclick="editFphoto(\''+rec.fid+'\', \''+rec.fphoto+'\')" href="javascript:void(0)" >商品图片</a>';

                var b = '<a class="editcls2" onclick="editDetail(\''+rec.fid+'\')" href="javascript:void(0)" >商品详情</a>';

                return a+b;

            }

        }

    ]], 
    .......

private void addFoodOp(HttpServletRequest request,HttpServletResponse response) {
    /*
    //注释部分 
    // 这是惯常喜欢的写法 
    String fname = request.getParameter("fname");
         
    double normprice = Double.parseDouble(request.getParameter("normprice"));
 
    double nowprice = Double.parseDouble(request.getParameter("nowprice"));
 
    String description = request.getParameter("description");
 
    FoodBiz fb = new FoodBizImpl();
    try {
        Food food = fb.addFood(fname, normprice,nowprice,description);   
       
        super.outData(response, food);
 
    } catch (Exception e) {
        e.printStackTrace();
    }
    */
         
    //  简单利用反射: 
    Food f = RequestUtil.parseRequest(request, Food.class );
  
    FoodBiz fb = new FoodBizImpl();

    try {

        f = fb.addFood(f);
             
        List<Food> list = (List<Food>) request.getSession().getServletContext().getAttribute( CommonData.APPLICATIONFOODKEY );

       list.add(f);

       request.getSession().getServletContext().setAttribute(CommonData.APPLICATIONFOODKEY, list );

       super.outData(response, f);

    } catch (Exception e) {

       e.printStackTrace();

    }
 }

    

package com.yc.utils;
import java.lang.reflect.Method;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
public class RequestUtil {
    /**
    * @author 牧羊的伯格女皇
    * @date: 2015-10-15
    * */
    public static <T> T parseRequest(HttpServletRequest request, Class<T> c){
        T t;
        try {
            t = c.newInstance(); // 根据反射实例生成对象    
            Method []  ms = c.getMethods();
            //1.取出request中所有键值对 注意  Map<String,String[]>  键值对 当成数组看待
            Map<String,String[]> map = request.getParameterMap();
            //2.循环所有的键  在前面加一个 set 形成  setXXXX
            for(Map.Entry<String, String[] > entry: map.entrySet() ){
                String key = entry.getKey();   // 得到这个键  
                String [] values = entry.getValue();
                if( values != null && values.length > 1 ){
                    continue;
                 }
                 String v = values[0];
                 key="set"+key;  
                 //3.循环 反射实例c中所有的方法  查找页面的 setXXXX的方法
                 for(Method m : ms ){
                     if( key.equalsIgnoreCase( m.getName() )){
                     //4. 激活这个方法  将这个键所对应的值存进去即可  相当于你调用了  obj.setXXXXX(值)
                     //但是 可能面对参数的类型 太多   
                     //判断m 的采纳数类型
                      String parameteTypeName = m.getParameterTypes()[0].getName(); //取出参数的类型名
                       
                      if( "int".equals(parameteTypeName ) || "java.lang.Integer".equals(parameteTypeName ) ){
                           m.invoke(t, Integer.parseInt(v) ); 
                      }else if( "float".equals(parameteTypeName ) || "java.lang.Float".equals(parameteTypeName ) ){
                           m.invoke(t, Integer.parseInt(v) );
                      }else if( "double".equals(parameteTypeName ) || "java.lang.Double".equals(parameteTypeName ) ){
                           m.invoke(t, Integer.parseInt(v) );
                      }else if( "long".equals(parameteTypeName ) || "java.lang.Long".equals(parameteTypeName ) ){
                           m.invoke(t, Integer.parseInt(v) );
                      }else if( "short".equals(parameteTypeName ) || "java.lang.Short".equals(parameteTypeName ) ){
                           m.invoke(t, Integer.parseInt(v) );
                      }else if( "java.lang.String".equals(parameteTypeName ) ){
                           //这里需要注意String类型并非java中的基本数据类型 
                           m.invoke(t, v);
                      }
                      break;
                    }     
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
        return t;
    }
}

你可能感兴趣的:(java中的反射小运用)