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