Map与Bean互转(下划线转大写)

import java.beans.BeanInfo;  
import java.beans.Introspector;  
import java.beans.PropertyDescriptor;  
import java.lang.reflect.Method;  
import java.util.HashMap;  
import java.util.Map;  
 
import org.apache.commons.beanutils.BeanUtils;  

/** 
 *  Map与Bean互转
 * 
 * 
* 当把Person类作为BeanUtilTest的内部类时,程序出错<br> 
* java.lang.NoSuchMethodException: Property '**' has no setter method<br> 
* 本质:内部类 和 单独文件中的类的区别 <br> 
* BeanUtils.populate方法的限制:<br> 
* The class must be public, and provide a public constructor that accepts no arguments. <br> 
* This allows tools and applications to dynamically create new instances of your bean, <br> 
* without necessarily knowing what Java class name will be used ahead of time 
*/  
public class MapBeanConvertUtil {  
 
   /**
    * <p class="detail">
    * 功能:Map --> Bean 2: 利用org.apache.commons.beanutils 工具类实现 Map --> Bean  
    * 	推荐使用
    * </p>
    * @author wuxw
    * @param map
    * @param obj 
    * @throws
    */
   public static void transMap2Bean(Map<String, Object> map, Object obj) {  
       if (map == null || obj == null) {  
           return;  
       }  
       try {  
           BeanUtils.populate(obj, map);  
       } catch (Exception e) {  
           System.out.println("transMap2Bean2 Error " + e);  
       }  
   }  
 
   // Map --> Bean 1: 利用Introspector,PropertyDescriptor实现 Map --> Bean  
   public static void transMap2Bean2(Map<String, Object> map, Object obj) {  
 
       try {  
           BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());  
           PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();  
 
           for (PropertyDescriptor property : propertyDescriptors) {  
               String key = property.getName();  
 
               if (map.containsKey(key)) {  
                   Object value = map.get(key);  
                   // 得到property对应的setter方法  
                   Method setter = property.getWriteMethod();  
                   setter.invoke(obj, value);  
               }  
 
           }  
 
       } catch (Exception e) {  
           System.out.println("transMap2Bean Error " + e);  
       }  
 
       return;  
 
   }  
   
   /**
    * <p class="detail">
    * 功能: Map --> Bean 1: 利用Introspector,PropertyDescriptor实现 Map --> Bean 
    * 	固定hibernateBean类型转换:  user_name 转 userName ,注意严格验证参数 
    * 	
    * </p>
    * @author wuxw
    * @param map
    * @param obj 
    * @throws
    */
   public static void transMap2HiberanteBean(Map<String, Object> map, Object obj) {  
 
       try {  
           BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());  
           PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();  
 
           for (PropertyDescriptor property : propertyDescriptors) {  
               String key = property.getName();  
               //将key中大写字符转为_大写
               key = underscoreName(key);
               
               if (map.containsKey(key)) {  
                   Object value = map.get(key);  
                   // 得到property对应的setter方法  
                   Method setter = property.getWriteMethod();  
                   setter.invoke(obj, value);  
               }  
 
           }  
 
       } catch (Exception e) {  
           System.out.println("transMap2Bean Error " + e);  
       }  
 
       return;  
 
   } 
   
   
   // Bean --> Map 1: 利用Introspector和PropertyDescriptor 将Bean --> Map  
   public static Map<String, Object> transBean2Map(Object obj) {  
 
       if(obj == null){  
           return null;  
       }          
       Map<String, Object> map = new HashMap<String, Object>();  
       try {  
           BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());  
           PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();  
           for (PropertyDescriptor property : propertyDescriptors) {  
               String key = property.getName();  
               // 过滤class属性  
               if (!key.equals("class")) {  
                   // 得到property对应的getter方法  
                   Method getter = property.getReadMethod();  
                   Object value = getter.invoke(obj);  
 
                   map.put(key, value);  
               }  
 
           }  
       } catch (Exception e) {  
           System.out.println("transBean2Map Error " + e);  
       }  
 
       return map;  
 
   }  
   
   /**
    * <p class="detail">
    * 功能:将大写转为下划线,且小写 如: userName > user_name
    * </p>
    * @author wuxw
    * @param name
    * @return 
    * @throws
    */
   static String underscoreName(String name)  
   {  
     StringBuilder result = new StringBuilder();  
     if ((name != null) && (name.length() > 0)) {  
       result.append(name.substring(0, 1).toLowerCase());  
       for (int i = 1; i < name.length(); ++i) {  
         String s = name.substring(i, i + 1);  
         if (s.equals(s.toUpperCase())) {  
           result.append("_");  
           result.append(s.toLowerCase());  
         }  
         else {  
           result.append(s);  
         }  
       }  
     }  
     return result.toString();  
   }
} 
原创: 点击打开链接
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值