一、概述
JavaBean一种特殊的Java对象。特点如下:
- 所有的成员私有
- 对外提供公共的setter 和 getter方法(boolean可以get也可以是is)
- 提供空参的构造
- JavaBean属性名要求:前两个字母要么都大写,要么都小写
符合以上规范的类成员,称为javabean的属性。可以用特定的方法,对javabean的属性进行统一的自动赋值操作。
二、内省
1.概念
内省的目标是得到JavaBean属性的读、写方法的反射对象,通过反射对JavaBean属性进行操作的一组API。(哪个2货起的内省这个名字,我保证不打死你),特点如下:
- 对反射的一层封装。可以获取一个对象的读和写的方法和属性。
- BeanInfo:就是对一个JavaBean类的描述(属性,方法,事件)
- Introspector:获取BeanInfo对象
内省的条件是:
- map中的key必须与javabean的类中的成员变量名字相同
2.内省的方式
2.1 sun公司原始的方法
每个PropertyDescriptor对象对应一个JavaBean属性:
- String getName():获取JavaBean属性名称;
- Method getReadMethod:获取属性的读方法;
- Method getWriteMethod:获取属性的写方法。
//1.建立一个map集合,模板表单提交方式
HashMap<String,String> hm = new HashMap<String,String>();
hm.put("username", "zhangsan");
hm.put("password","22");
//2.通过sun公司的内省方式,获取参数
BeanInfo beaninfo = Introspector.getBeanInfo(User.class);
PropertyDescriptor[] pds = beaninfo.getPropertyDescriptors();
//3.创建对象,用于装数据
User user = new User();
for (PropertyDescriptor pd : pds) {
//遍历集合,如果集合中有与类成员名称相同的,刚取出,用反射赋值
String name=pd.getName();
String value=hm.get(name);
if(value!=null){//如果map和类成员中的对象相符,则开始写入
Method writeMethod = pd.getWriteMethod();//底层用反射的方法
writeMethod.invoke(user, value);//反射调用方法
}
}
2.2 appach公司的commons-beanutils
它底层使用了内省,对内省进行了大量的简化!要导入如下两个包:
- commons-beanutils.jar
- commons-logging.jar
//指定编码
request.setCharacterEncoding("utf-8");
//1.得到form表单提交的参数,用map接收
Map pm = request.getParameterMap();
User user = new User();
//2.用内省的方式,调用org.apache.commons.beanutils.BeanUtils,把map中的数据写到user中
BeanUtils.populate(user, pm);
System.out.println(user);