beanutils 的简单应用

什么是beanutils: 从字面意上来说就是一个 java bean 工具,通过反射技术完成以前需要手动完成的工作 。

什么是 java bean: java bean 的中心思想是复用,狭义的java bean (也就是我们经常使用的) 大概可以这样定义

(1) 该bean 类必须设计成 public(为了复用)

(2) 必须有一个无参的构造

 (3) 非静态字段对应的标准的get & set 方法

(4) 如果是boolean 类型 get 方法可以使用 isxxx以下是具体用法的说明,以代码注释的表现形式说明两个 entity bean 类 分别是 student   & person

public class Student {
	private int id;
	private String name;
	private String major;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getMajor() {
		return major;
	}
	public void setMajor(String major) {
		this.major = major;
	}
}
public class Person {
		private int id;
		private String name;
		// 订阅报纸
		private Map<String,String> orderPaperMap;
		//分数集合
		private String[] scoreArray;
		public Map<String, String> getOrderPaperMap() {
			return orderPaperMap;
		}
		public void setOrderPaperMap(Map<String, String> orderPaperMap) {
			this.orderPaperMap = orderPaperMap;
		}
	
		public String[] getScoreArray() {
			return scoreArray;
		}
		public void setScoreArray(String[] scoreArray) {
			this.scoreArray = scoreArray;
		}
		public int getId() {
			return id;
		}
		public void setId(int id) {
			this.id = id;
		}
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		} } 
public class Test {
	public static void main(String[] args) throws IllegalAccessException,
			InvocationTargetException, NoSuchMethodException {
		propertyUtilsTest();
		BeanUtilsTest();
		sort();
	}
	static void propertyUtilsTest() throws IllegalAccessException,
			InvocationTargetException, NoSuchMethodException {
		// 处理简单对象
		// 1 PropertyUtils.setSimpleProperty() &
		// PropertyUtils.getSimpeProperty()
		// 解释:获得和设置简单字段的值(换句话说就是不能设置费简单字段,比如集合对象),
		// 但是个人通过检测发现可以设置复杂对象,并且可以得到复杂的对象.
		// 2 PropertyUtils.setProperty() & propertyUtils.getProperty();
		// 解释 : 设置或返回一个指定字段的值
		// 简单对象 start
		Person person = new Person();
		// 设置bean.id 的值
		PropertyUtils.setSimpleProperty(person, "id", 5);
		// 获得bean.id 的值 返回Object 需要转换
		System.out.println(PropertyUtils.getProperty(person, "id"));
		// 简单对象 end
		// 复杂对象 start
		// 1. 可以使用 PropertyUtils.setProperty() & propertyUtils.getProperty();
		// 处理 String[] scoreArray;
		String[] scoreArray = new String[] { "100", "80", "60" };
		PropertyUtils.setProperty(person, "scoreArray", scoreArray);
		// 经过测试发现可以设置和获得复杂对象 , 但是 不可以在进一步获得相应的值了
		// 比如 System.out.println(PropertyUtils.getSimpleProperty(p,
		// "scoreArray[0]"));
		// 这样做就会出现异常
		// 解释 : 带索引的属性名称是不被允许使用的 (在getSimpleProperty() 方法里面)
		// 如果想要scoreArray[0] 使用需要调用 PropertyUtils.getIndexProperty
		// 同样返回值是object 类型,需要转换使用
		System.out.println(PropertyUtils.getProperty(person, "scoreArray[0]"));
		// 2. 可以使用 PropertyUtils.setIndexProperty() &
		// PropertyUtils.getIndexProperty();
		// 这组方法不太适合我们日常的开发,因为会考虑到如果数组初始化大小为1,新的值却添加到下标为2 的地方 就会出问题
		PropertyUtils.setIndexedProperty(person, "scoreArray[0]", "100");
		// getIndexProperty 也有和set 一样的问题 ,如果查询索引下标的超出范围 会抛出Array越界错误
		System.out.println(PropertyUtils.getIndexedProperty(person,
				"scoreArray", 1));
		// getMappedProperty & setMappedProperty
		// 操作 key & value 的一组方法,注 map 不能自动初始化,所以需要做一编程序初始化 ,
		// p.setOrderPaperMap(new HashMap<String, String>()); 或在entity 构造的时候初始化
		person.setOrderPaperMap(new HashMap<String, String>());
		PropertyUtils.setMappedProperty(person, "orderPaperMap(a)", "b");
		System.out.println(PropertyUtils.getMappedProperty(person,
				"orderPaperMap(a)"));
		// getNestedProperty 和 setNestedProperty 这个实体字段是对象
		// 不做解释 Api 文档有相应的说明
		// 复杂对象 end
		// 拷贝javabean 对象 start
		Student student = new Student();
		PropertyUtils.copyProperties(student, person);
		System.out.println(student.getId());
		// end
	}
	static void BeanUtilsTest() throws IllegalAccessException,
			InvocationTargetException, NoSuchMethodException {
		// 经过资料的查询和个人的看法 ,认为 BeanUtils 是一个主要使用的类
		// 其原因有
		// 1 . 去掉了不合适的方法 比如 在 propertyUtils 里面有 setSimpleProperty 和
		// setIndexProperty
		// 在 BeanUtils 只有一个 setProperty一个方法,有可能设计者当时发现使用这个方法足以解决问题。
		// 2. 添加一些实用的方法 具体有 getArrayProperty(Object bean, String name)
		// ,populate(Object bean, Map properties) 等
		// 本人在一个博客上看到一个使用 populate(填充) 的例子
		// 因为现在java 开发多半使用框架,给我的感觉以下的代码不如struts,struts2 等框架提供的功能全面
		// 理由 (1) 类型自动反射转换 (2) 值自动填充
		// 以下是一个示意性质的代码
		HttpServletRequest request = null;
		Enumeration enumeration = request.getParameterNames();
		Map<String, Object> map = new HashMap();
		while (enumeration.hasMoreElements()) {
			String param = (String) enumeration.nextElement();
			map.put(param, request.getParameter(param));
		}
		BeanUtils.populate(new Object(), map);
		// 其他的功能和propertyUtils 里面的方法不差一二
	}
	/**
	 * 使用 BeanComparator对象排序 1. BeanComparator 必定是一个实现了Comparator接口的类 2. 具体比较方法是
	 * compare(),其实和我们平时实现的没有什么不一样
	 */
	static void sort() {
		List<Person> personList = new ArrayList();
		for (int i = 10; i > 0; i--) {
			Person p = new Person();
			p.setId(i);
			personList.add(p);
		}
		Collections.sort(personList, new BeanComparator("id"));
		for (Person p : personList) {
			System.out.println(p.getId());
		}
	}

}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值