java 反射获取 属性

碰到业务需要存历史记录表,所有表都要存历史,所以需要一个公共方法随时调用,就写了一个根据java bean 直接获取属性并将驼峰命名方式转换为数据库字段名下划线命名方式,有子父类关系,所以记录一下做的过程

/**
 * @Description: 保存历史表数据记录的工具类
 */
@Slf4j
public class HisTableUtil {

  
 static String[] types = {"java.lang.Integer",
            "java.lang.Double",
            "java.lang.Float",
            "java.lang.Long",
            "java.lang.Short",
            "java.lang.Byte",
            "java.lang.Boolean",
            "java.lang.Character",
            "java.lang.String",
            "int","double","long","short","byte","boolean","char","float"};
    /**
     * 
    * @Title: classToProperty 
    * @Description: TODO(将class对象取出属性名并且按照数据库命名方式返回) 
    * @param  cls
    * @param  listFiled  封装属性后的list
    * @param  listValue  封装属性后值的list
    * @param @return  参数说明 
    * @return List<String>    返回类型 
    * @throws
     */
    public static Map<String,Object> classToProperty(Object obj){
        Map<String,Object> resultMap = new HashMap<>();
            List<Object> filedList = new ArrayList<>();
            List<Object> valueList = new ArrayList<>();
        try {
            List<Field> fieldList = new ArrayList<>() ;
            Class<?> cls = obj.getClass();
            while (cls != null) {  //当父类为null的时候说明到达了最上层的父类(Object类).
                  fieldList.addAll(Arrays.asList(cls .getDeclaredFields()));
                  cls = cls.getSuperclass(); //得到父类,然后赋给自己
            }
            Field[] fields = new Field[fieldList.size()];
            fieldList.toArray(fields);
            for (int i = 0; i < fields.length; i++) {
                 Field field = fields[i];
                 field.setAccessible(true);
                 String name = field.getName();
                 if(name.equals("serialVersionUID")) {
                     continue;
                 }
                 if(name.equals("log")) {
                     continue;
                 }
                if(Arrays.asList(types).contains(field.getType().getName())) {
                         filedList.add(changeFieldToColumnName(name));
                         Object value = field.get(obj) ;
                         valueList.add(value);
                     }
            }
        }  catch (Exception e) {
            log.error("-->> classToProperty(cls, filedList, valueList) - error:异常", e);
        }
        resultMap.put("filedList", filedList);
        resultMap.put("valueList", valueList);
        return resultMap;
    }
        
    /**
    * @Title: changeFieldToColumnName 
    * @Description: TODO(将驼峰风格的字符串转换为以下划线分隔的数据库字段) 
    * @param  fieldName  转换的字符串
    * @return String    返回类型 
    * @throws
     */
    public static String changeFieldToColumnName(String fieldName) {
        if (fieldName == null) {
            return null;
        }
        StringBuffer columnName = new StringBuffer();
        int length = fieldName.length();
        for (int i = 0; i < length; i++) {
            char c = fieldName.charAt(i);
            if ('A' <= c && 'Z' >= c) {
                columnName.append("_").append((char) (c + 32));
            } else {
                columnName.append(fieldName.charAt(i));
            }
        }
        return columnName.toString();
    }
    
    /**
        * 将以下划线分隔的数据库字段转换为驼峰风格的字符串
     * @param fieldName
     * @return
     */
    public static String changeColumnToFieldName(String columnName) {
        String[] array = columnName.split("_");
        StringBuffer sb = null;
        for (String cn : array) {
            cn = cn.toLowerCase();
            if (sb == null) {
                sb = new StringBuffer(cn);
                continue;
            }
            sb.append(cn.substring(0, 1).toUpperCase()).append(cn.substring(1));
        }
        return sb.toString();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值