什么是javabean ,内省, BeanUtils工具类

什么是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);
	}

猜你喜欢

转载自blog.csdn.net/qq_20610631/article/details/81335183
今日推荐