使用PropertyDescriptor获取参数反射封装对象——问题总结

获取参数反射封装对象

  • 问题:如果获取的参数有10个,那么就需要写十次String xx= req.getParameter("xx");,这样太麻烦
  • 那我们就可以采用反射封装对象方式
  • 此种封装的使用要求是,表单<input>标签的name属性取值,必须和实体类中定义的属性名称一致
  • 代码演示:
package com.lyw.servlet;

import com.lyw.bean.Student;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Map;

// 封装对象-反射方式(使用反射+内省实现数据模型的封装)
// 内省:是sun公司推出的一套简化反射操作的规范。把javabean中的属性都封装成一个属性描述器。
// 属性描述器中会有字段信息,get和set方法(取值或存值)
@WebServlet("/demo05")
public class Demo05Encapsulation extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取所有数据
        Map<String, String[]> map = req.getParameterMap();

        //2.封装学生对象
        Student stu = new Student();
        for (String name : map.keySet()) {
            String[] value = map.get(name);
            try {
                // 获取Student对象的属性描述器
                // 构造函数的第一个参数决定是哪个属性的描述器。第二个参数是当前属性所属对象的字节码
                PropertyDescriptor pd = new PropertyDescriptor(name, stu.getClass());
                // 获取对应的setXxx方法
                Method writeMethod = pd.getWriteMethod();
                if (value.length > 1) {
                    writeMethod.invoke(stu, (Object) value); // 如果是多个属性值,需要转换为object
                } else {
                    writeMethod.invoke(stu, value); // 通过当前属性描述器的写入方法,将value写入stu对象的这个属性身上
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        //3.输出对象
        System.out.println(stu);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
  • writeMethod.invoke(obj, args):执行该Method.invoke方法的参数是执行这个方法的对象obj,和参数数组args,可以这么理解:owner对象中带有参数args的method方法。返回值是Object,也既是该方法的返回值。

  • 在invoke方法中,把args强转为Object

    要不然数组会被解析成一个个参数,而不是一整个数组作为参数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值