什么是javabean
javaBean的规范:
1. 必须要有一个默认构造器
2. 提供get/set方法,如果只有get方法,那么这个属性是只读属性!
3. 属性:有get/set方法的成员,还可以没有成员,只有get/set方法。属性名称由get/set方法来决定!而不是成员名称!
这个里面name 是属性,username 不是属性
4. 方法名称满足一定的规范,那么它就是属性!boolean类型的属性,它的读方法可以是is开头,也可以是get开头!
JavaBean属性
JavaBean属性是具有getter/setter方法的成员变量。
也可以只提供getter方法,这样的属性叫只读属性;
也可以只提供setter方法,这样的属性叫只写属性;
如果属性类型为boolean类型,那么读方法的格式可以是get或is。例如名为abc的boolean类型的属性,它的读方法可以是getAbc(),也可以是isAbc();
JavaBean属性名要求:前两个字母要么都大写,要么都小写:
2 内省(了解)
内省的目标是得到JavaBean属性的读、写方法的反射对象,通过反射对JavaBean属性进行操作的一组API。例如User类有名为username的JavaBean属性,通过两个Method对象(一个是getUsenrmae(),一个是setUsername())来操作User对象。
如果你还不能理解内省是什么,那么我们通过一个问题来了解内省的作用。现在我们有一个Map,内容如下:
Map<String,String> map = new HashMap<String,String>();
map.put("username", "admin");
map.put("password", "admin123");
public class User {
private String username;
private String password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
public User() {
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}
现在需要把map的数据封装到一个User对象中!User类有两个JavaBean属性,一个叫username,另一个叫password。
你可能想到的是反射,通过map的key来查找User类的Field!这么做是没有问题的,但我们要知道类的成员变量是私有的,虽然也可以通过反射去访问类的私有的成员变量,但我们也要清楚反射访问私有的东西是有“危险”的,所以还是建议通过getUsername和setUsername来访问JavaBean属性。
2.1 内省之获取BeanInfo
我们这里不想去对JavaBean规范做过多的介绍,所以也就不在多介绍BeanInfo的“出身”了。你只需要知道如何得到它,以及BeanInfo有什么。
通过java.beans.Introspector的getBeanInfo()方法来获取java.beans.BeanInfo实例。
BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
2.2 得到所有属性描述符(PropertyDescriptor)
通过BeanInfo可以得到这个类的所有JavaBean属性的PropertyDescriptor对象。然后就可以通过PropertyDescriptor对象得到这个属性的getter/setter方法的Method对象了。
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
每个PropertyDescriptor对象对应一个JavaBean属性:
String getName():获取JavaBean属性名称;
Method getReadMethod:获取属性的读方法;
Method getWriteMethod:获取属性的写方法。2.3 完成Map数据封装到User对象中
public void fun1() throws Exception {
Map<String,String> map = new HashMap<String,String>();
map.put("username", "admin");
map.put("password", "admin123");
//获取User类型的BeanInfo实例
BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
//获取User类型的所有JavaBean属性的属性描述符对象
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
//创建User实例
User user = new User();
//循环遍历每个属性描述符对象
for(PropertyDescriptor pd : pds) {
//获取JavaBean属性名
String name = pd.getName();
//获取Map中对应属性的值
String value = map.get(name);
//如果在Map中存在这个属性的值
if(value != null) {
//获取该属性的写方法
Method writeMethod = pd.getWriteMethod();
//把Map中的值写入到user对象的对应属性中
writeMethod.invoke(user, value);
}
}
System.out.println(user);
}
BeanUtils工具类
3 commons-beanutils
提到内省,不能不提commons-beanutils这个工具。它底层使用了内省,对内省进行了大量的简化!
使用beanutils需要的jar包:
commons-beanutils.jar;
commons-logging.jar;
3.1 设置JavaBean属性
User user = new User();
//设置user对象的username属性为admin
BeanUtils.setProperty(user, "username", "admin");
//设置user对象的password属性为admin123
BeanUtils.setProperty(user, "password", "admin123");
System.out.println(user);
3.2 获取JavaBean属性
User user = new User("admin", "admin123");
//获取user对象的username属性值
String username = BeanUtils.getProperty(user, "username");
//获取user对象的password属性值
String password = BeanUtils.getProperty(user, "password");
System.out.println("username=" + username + ", password=" + password);
3.3 封装Map数据到JavaBean对象中
Map<String,String> map = new HashMap<String,String>();
map.put("username", "admin");
map.put("password", "admin123");
User user = new User();
//把map中的数据封装到user对象中,要求user的属性名要与map的key一致。
BeanUtils.populate(user, map);
System.out.println(user);
package cn.itcast.domain;
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
}
package cn.itcast.domain;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
import org.junit.Test;
import cn.itcast.utils.CommonUtils;
public class Demo1 {
//设置JavaBean属性
@Test
public void fun1() throws Exception {
String className = "cn.itcast.domain.Person";
Class clazz = Class.forName(className);
Object bean = clazz.newInstance();
BeanUtils.setProperty(bean, "name", "张三");
BeanUtils.setProperty(bean, "age", "23");
BeanUtils.setProperty(bean, "gender", "男");
BeanUtils.setProperty(bean, "xxx", "XXX");// 不属于user 的属性不会显示出来
//获取user对象的username属性值
String gender= BeanUtils.getProperty(user, "gender");
//获取user对象的password属性值
String name= BeanUtils.getProperty(user, "name");
System.out.println(gender+","+name);
System.out.println(bean);
}
}
/*
* 把map中的属性直接封装到一个bean中
*
* Map: {"username":"zhangSan", "password","123"}
* 我们要把map的数据封装到一个javabean中!要求map的key与bean的属性名相同!
*/
@Test
public void fun2() throws Exception {
Map<String,String> map = new HashMap<String,String>();
map.put("username", "zhangSan");
map.put("password", "123");
User user = new User();
BeanUtils.populate(user, map);
System.out.println(user);
}
/**
* 把map转换成指定类型的javaBean对象
* @param map
* @param clazz
* @return
*/
public static <T> T toBean(Map map, Class<T> clazz) {
try {
/*
* 1. 创建指定类型的javabean对象
*/
T bean = clazz.newInstance();
/*
* 2. 把数据封装到javabean中
*/
BeanUtils.populate(bean, map);
/*
* 返回javabean对象
*/
return bean;
} catch(Exception e) {
throw new RuntimeException(e);
}
}
@Test
public void fun3() {
Map<String,String> map = new HashMap<String,String>();
map.put("username", "zhangSan");
map.put("password", "123");
/*
* request.getParameterMap();//可以把所有的key value 都可以获取到
*/
User user = CommonUtils.toBean(map, User.class);
System.out.println(user);
}