Beanutil应用

 0 包

org.apache.commons.beanutils
org.apache.commons.beanutils.converters
org.apache.commons.beanutils.locale
org.apache.commons.beanutils.locale.converters

 1  基础类

Order

public class Order {
	private User user;
	private Integer id;
	private String desc;
	public User getUser() {
                
                // setter/getter
}

User

public class User {
	private Integer id;
	private Map map;
	private String username;
// setter/getter
}

测试类Test

public class Test {
    private User user = new User();    
    private Order order1 = new Order();    
    private Order order2 = new Order();    
    private Order order3 = new Order();    
    private Map map = new HashMap();    
    private User user1 = new User();    
   
    public Test(){    
        init();    
    }    

   //初始化    
    public void init(){    
   
        user.setId(0);    
        user.setUsername("zhangshan");    
            
        order1.setId(1);    
        order1.setDesc("order1");    
        order1.setUser(user);        
            
        order2.setId(2);    
        order2.setDesc("order2");    
        order2.setUser(user);    
            
        order3.setId(3);    
        order3.setDesc("order3");    
        order3.setUser(user);    
            
        map.put("order1", order1);    
        map.put("order2", order2);    
        map.put("order3", order3);    
            
        user1.setId(1);    
        user1.setUsername("lisi");    
        user1.setMap(map);    
    }   
}

 2  测试代码

测试代码写在Test的main函数中:

        Test test = new Test();    
... ... 

a  获取对象的属性

  

 System.out.println(BeanUtils.getProperty(test.user, "username"));   

b  获取对象的内嵌属性

      //输出某个对象的内嵌属性,只要使用点号分隔    
        System.out.println(BeanUtils.getProperty(test.order1, "user.username"));  

c  获取List和Map的属性

        //BeanUtils还支持List和Map类型的属性,对于Map类型,则需要以"属性名(key值)"的    
        //对于Indexed,则为"属性名[索引值]",注意对于ArrayList和数组都可以用一样的方式进行操作    
        System.out.println(BeanUtils.getProperty(test.user1, "map(order2).desc"));     

 d  拷贝对象

        //拷贝对象的属性值    
        User tempUser = new User();    
        BeanUtils.copyProperties(tempUser, test.user1);    
            
        System.out.println(tempUser.getUsername());    
        System.out.println(tempUser.getId());  

e  动态排序

  // 动态设定Bean按照哪个属性来排序,而不再需要再实现bean的Compare接口进行复杂的条件判断
        List<Order> list = new ArrayList<Order>();    
        
        list.add(test.order2);    
        list.add(test.order1);    
        list.add(test.order3);    
            
        //未排序前    
        for(Order order : list){    
            System.out.println(order.getId());    
        }    
        //排序后    
        Collections.sort(list, new BeanComparator("id"));    
        for(Order order : list){    
            System.out.println(order.getId());    
        }   
 //:支持多个属性的复合排序 ; 如"Order By id,desc" 
        List  sortFields = new ArrayList();     
        sortFields.add(new BeanComparator("id"));    
        sortFields.add(new BeanComparator("desc"));    
        ComparatorChain multiSort = new ComparatorChain(sortFields);    
        Collections.sort(list, multiSort);    
            
        for(Order order : list){    
            System.out.println(order.getId());    
        }
         // C:使用ComparatorUtils进一步指定排序条件
        //	上面的排序遇到属性为null就会抛出异常, 也不能设定升序还是降序。
        // 不过,可以借助commons-collections包的ComparatorUtils
        //  BeanComparator,ComparableComparator和ComparatorChain都是实现了Comparator这个接口
        // java 代码
        //上面的排序遇到属性为null就会抛出异常, 也不能设定升序还是降序。    
        //不过,可以借助commons-collections包的ComparatorUtils    
        //BeanComparator,ComparableComparator和ComparatorChain都是实现了Comparator这个接口    
        Comparator mycmp = ComparableComparator.getInstance();       
        mycmp = ComparatorUtils.nullLowComparator(mycmp);  //允许null       
        mycmp = ComparatorUtils.reversedComparator(mycmp); //逆序       
        Comparator cmp = new BeanComparator("id", mycmp);    
        Collections.sort(list, cmp);    
        for(Order order : list){    
            System.out.println(order.getId());    
        } 

  

 f  Converter 把Request或ResultSet中的字符串绑定到对象的属性

    从request,resultSet等对象取出值来赋入bean中

      

MyBean bean = ...;   
        HashMap map = new HashMap();    
        Enumeration names = request.getParameterNames();    
        while (names.hasMoreElements())    {      
        	String name = (String) names.nextElement();      
        	map.put(name, request.getParameterValues(name));    
        }    
        BeanUtils.populate(bean, map);

 3  API

     BeanUtils: JavaBean克隆及属性拷贝

static Object cloneBean(Object bean) : 获取拷贝对象属性
static void copyProperties(Object dest, Object orig):拷贝对象
static void copyProperty(Object bean, String name, Object value):拷贝对象的属性
static Map describe(Object bean) ://用来将一个bean以map的形式展示
static void populate(Object bean, Map properties) : //使用一个map为bean赋值
// Simple:简单类型,如String、Int......:  
static void setProperty(Object bean, String name, Object value) ;  
static String getProperty(Object bean, String name) : 属性值 
 // Indexed:索引类型,如数组、arrayList......:   
static String getIndexedProperty(Object bean, String name)   
static String getIndexedProperty(Object bean, String name, int index)
 // Maped:即Map,比如HashMap...... :   
static static String getMappedProperty(Object bean, String name, String key)    
static String getMappedProperty(Object bean, String name)  
//  设置获取属性值:  
//1:获取Indexed值 
	BeanUtils.getIndexedProperty(orderBean,"items",1);
//	或者
 	BeanUtils.getIndexedProperty(orderBean,"items[1]");
// 2:Maped:即Map,比如HashMap...... : 
  	BeanUtils.getMappedProperty(orderBean, "items","111");//key-value goods_no=111 
//	或者
  	BeanUtils.getMappedProperty(orderBean, "items(111)") 
// 3: 获取内嵌类的属性值和Simple类:
           BeanUtils.getProperty(test.order1, "user.username")  

 PropertyUtils:JavaBean属性拷贝
和BeanUtils类很多的方法在参数上都是相同的,但返回值不同。
    BeanUtils着重于属性,它的返回值通常是Object

// 复制对象
static void copyProperties(Object dest, Object orig) 
// set、get对象的属性
static void setProperty(Object bean, String name, Object value) 
static Object getProperty(Object bean, String name) 
// 获取对象属性的类型:如果属性不存在,则为null
 static Class getPropertyType(Object bean, String name) 
//  以map返回bean的值
static Map describe(Object bean) 

// set、get的数组和列表的值
static Object getIndexedProperty(Object bean, String name) 
static Object getIndexedProperty(Object bean, String name, int index) 
static void setIndexedProperty(Object bean, String name, int index, Object value) 
 static void setIndexedProperty(Object bean, String name, Object value) 

// set、get的map的属性
static Object getMappedProperty(Object bean, String name) 
static Object getMappedProperty(Object bean, String name, String key) 
static void setMappedProperty(Object bean, String name, Object value) 
static void setMappedProperty(Object bean, String name, String key, Object value) 
   

注意:BeanUtils与PropertyUtils的区别
BeanUtils对Bean赋值是会进行类型转化。举例来说也就是在copyProperty只要属性名相同,就算类型不同,BeanUtils也可以进行copy:而PropertyBean则可能报错。 

 ConverUtils:类型转换

MethodUtils:JavaBean方法调用,动态调用方法,得到方法,主要方法有:

// 动态调用方法
static Object invokeMethod(Object object, String methodName, Object arg) 
static Object invokeMethod(Object object, String methodName, Object[] args) 
static Object invokeMethod(Object object, String methodName, Object[] args, Class[] parameterTypes) 

// 得到方法
static Method getAccessibleMethod(Class clazz, Method method) 
static Method getAccessibleMethod(Class clazz, String methodName, Class parameterType) 
static Method getAccessibleMethod(Class clazz, String methodName, Class[] parameterTypes) 
static Method getAccessibleMethod(Method method) 

 


ConstructorUtils:构造Bean对象
这个类中的方法主要分成两种,一种是得到构造方法,一种是创建对象

//  获取动态构造器
static Constructor getAccessibleConstructor(Class klass, Class parameterType) 
static Constructor getAccessibleConstructor(Class klass, Class[] parameterTypes) 
static Constructor getAccessibleConstructor(Constructor ctor) 

//  调用构造器
static Object invokeConstructor(Class klass, Object arg) 
static Object invokeConstructor(Class klass, Object[] args) 
static Object invokeConstructor(Class klass, Object[] args, Class[] parameterTypes) 

ConvertUtils:将字符串转换为指定类型

// 转换为字符串
static String convert(Object value)  //将任意的实例转换为String 
// 将字符串value转换为clazz的一个实例:如果失败的话,就以String的形式返回value
static Object convert(String value, Class clazz) 
static Object convert(Object value, Class targetType) 
// 将数组中每个value都进行转换,最好以Object返回 
static Object convert(String[] values, Class clazz) 
 


BasicDynaBean:

LazyDynaBean:

  

猜你喜欢

转载自huangrongyou.iteye.com/blog/1506066