文档章节

java中的反射小运用

berg-dm
 berg-dm
发布于 2015/10/15 09:08
字数 658
阅读 61
收藏 3

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

//考虑到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;
    }
}

© 著作权归作者所有

berg-dm
粉丝 26
博文 98
码字总数 88970
作品 0
深圳
程序员
私信 提问
unsafe(未完成,持续更新)

unsafe本来的英文意思就是不安全的、危险的。在java中的角色同样也是不安全的、危险的。它是在java包中的sun.msic,官方不建议使用,因为它能直接操作底层JVM,并且可以修改内存,用不好的话...

latiaobo
08/28
66
0
注解(Annotation)--注解处理器

如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了。使用注解的过程中,很重要的一部分就是创建于使用注解处理器。Java SE5扩展了反射机制的API,以帮助程序员快速的构造...

boonya
2015/04/17
138
0
好程序员教程分享Java注解和运用注解编程

  好程序员教程分享Java注解和运用注解编程,注解和使用: 先来看下概念首先从注释来看; 注释:给代码添加说明和解释,注释帮助开发人员理解程序。(Comment)说白点就是注释是给人看的。...

好程序员IT
07/24
22
0
Java反射机制

问题: 在运行时,对一个JAVA类,能否知道属性和方法;能否调用它的任意方法? 答案是可以的,JAVA提供一种反射机制可以实现。 目录 什么是JAVA的反射机制 JDK中提供的Reflection API JAVA反...

长平狐
2012/08/29
642
0
08-《深度拆解JVM》之JVM是如何实现反射的?

一、问题引入 今天我们来讨论一下 Java 里的反射机制。反射是 Java 语言中一个相当重要的特性,它允许正在运行的 Java 程序观测,甚至是修改程序的动态行为。 举例来说,我们可以通过 Class ...

飞鱼说编程
2018/10/12
27
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx主备模式笔记

(1)两台服务器 192.168.17.129 和 192.168.17.131 (2)在两台服务器安装 keepalived 安装 keepalived (1)使用 yum 命令进行安装 yum install keepalived –y (2)安装之后,在 etc 里面...

行者终成事
今天
4
0
004-Docker镜像

Docker镜像 一个通用的私有仓库,可以提升效率 Docker镜像构建分为两种,一种是手动构建,一种是Dockerfile(自动构建) 基于centos镜像构建手动制作nginx镜像 docker run --name testdocker -...

伟大源于勇敢的开始
今天
5
0
OSChina 周一乱弹 —— 我就加班,不去世不休息

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :《For Forever》90后那些小鲜肉歌手中,好像只有花花的歌能吸引我,这小家伙对音乐的感觉真是天才一般!#今日歌曲推荐# 《For F...

小小编辑
今天
9
1
【领会要领】web前端-轻量级框架应用(jQuery基础)

作者 | Jeskson 来源 | 达达前端小酒馆 jquery的安装和语法,jquery的多种选择器,dom操作和jquery事件。 jQuery框架,简介,优势,安装,语法,jQuery选择器,id选择器,类选择器,标记选择...

达达前端小酒馆
今天
6
0
MySQL 常用命令

无须死记硬背,直接 copy 就好。 1. 查看目前 mysql 用户 select user,host,password from mysql.user; 2. 修改 root 密码(使用内置函数修改) set password for root@localhost=password('y......

HuaiAnGG
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部