【Java】下划线命名转驼峰命名,通过反射设置属性值

在mybatis中进行对象关系映射时,肯定会用到的一个功能就是,对属性赋值,且还要满足下划线命名与驼峰命名的规范. 在这里记录一下是如何实现的

/**
 * 下划线转驼峰
 * @param name 属性名
 * @return name 驼峰命名
 */
public String toHump(String name){
   if (name.contains("_")){
       Pattern pattern = Pattern.compile("_(\\w)");
       name = name.toLowerCase();
       Matcher matcher = pattern.matcher(name);
       StringBuffer sb = new StringBuffer();
       while (matcher.find()){
           matcher.appendReplacement(sb,matcher.group(1).toUpperCase());
       }
       matcher.appendTail(sb);
       return sb.toString();
   }
   return name;
}

/**
 * 根据字段名称设置,对象属性
 * @param o 要设置值的对象
 * @param columnName 字段名
 * @param columnValue 字段值
 */
public void setFieldValueForColumn(Object o,String columnName,Object columnValue){
    Class<?> clazz = o.getClass();
    try {
        // 根据字段获取属性
        Field field = clazz.getDeclaredField(columnName);
        // 私有属性开放权限
        field.setAccessible(true);
        field.set(o,columnValue);
        field.setAccessible(false);
    } catch (NoSuchFieldException | IllegalAccessException e) {
        // 没有找到对应的属性名,可能是下划线命名,在异常处理中装换
        if (columnName.contains("_")){
            // 重新调用方法设置属性
            setFieldValueForColumn(o,this.toHump(columnName),columnValue);
        }
    }
}

@Test
public void test1(){
    String name = "USER_NAME";
    String s = toHump(name);
    System.out.println(s); // userName
}

@Test
public void test2(){
    User user= new User();
    this.setFieldValueForColumn(vo,"user_name","用户名");
    System.out.println(user);
}

版权声明:本文为Passer_hua原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。