import com.xxxx.util.constant.PropertyNameStyle;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.util.ClassUtils;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
@Slf4j
public class GenericPropertyConverter {
public static final char UNDERLINE_CHAR = '_';
public static <T> T convertObject(Object originObj, PropertyNameStyle originStyle, Class<T> targetClass) {
return baseConvertObject(originObj, originStyle, targetClass, null, null);
}
public static <T, F> List<T> convertObject(List<F> originLst, PropertyNameStyle originStyle, Class<T> targetClass) {
if (Objects.isNull(originLst)) {
return null;
}
List<T> result = Lists.newArrayListWithCapacity(originLst.size());
originLst.forEach(o -> result.add(convertObject(o, originStyle, targetClass)));
return result;
}
/**
*
* @param originObj 待转换的源对象,【不可为null】
* @param originStyle 源对象的property的命名风格,【不可为null】
* @param targetClass 目标对象,【不可为null】FieldNamingPolicy
* @param customizePropertyNameMap 自定义转换属性,【可为null】
* @param excludePropertyNameList 自定义的排除属性,【可为null】
* @return
*/
public static <T> T baseConvertObject(Object originObj, PropertyNameStyle originStyle, Class<T> targetClass,
Map<String, String> customizePropertyNameMap, List<String> excludePropertyNameList) {
T targetObj;
try {
targetObj = targetClass.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
log.error("通用的风格属性名转换时出错\n{}", e.getMessage());
return null;
}
Class<?> originClass = originObj.getClass();
PropertyDescriptor[] originPds = BeanUtils.getPropertyDescriptors(originClass),
targetPds = BeanUtils.getPropertyDescriptors(targetClass);
Function<String, String> propertyConvertFunc = PropertyNameStyle.CAMEL.equals(originStyle)
? GenericPropertyConverter::camel2Underline
: GenericPropertyConverter::underline2Camel;
for (PropertyDescriptor originPd : originPds) {
String propertyName = originPd.getName();
if ("class".equals(propertyName)) {
continue;
}
if (CollectionUtils.isNotEmpty(excludePropertyNameList) && excludePropertyNameList.contains(propertyName)) {
continue;
}
String newPropertyName = StringUtils.EMPTY;
if (MapUtils.isNotEmpty(customizePropertyNameMap)) {
newPropertyName = customizePropertyNameMap.get(propertyName);
}
if (StringUtils.isBlank(newPropertyName)) {
newPropertyName = propertyConvertFunc.apply(propertyName);
}
if (StringUtils.isBlank(newPropertyName)) {
continue;
}
Class<?> originPropertyType = originPd.getPropertyType();
for (PropertyDescriptor targetPd : targetPds) {
if (newPropertyName.equals(targetPd.getName()) == false) {
continue;
}
Method originReadMethod = originPd.getReadMethod(),
targetWriteMethod = targetPd.getWriteMethod();
if (originReadMethod != null && targetWriteMethod != null
&& ClassUtils.isAssignable(targetWriteMethod.getParameterTypes()[0], originPropertyType)) {
try {
if (Modifier.isPublic(originReadMethod.getDeclaringClass().getModifiers()) == false) {
originReadMethod.setAccessible(true);
}
Object value = originReadMethod.invoke(originObj);
if (Modifier.isPublic(targetWriteMethod.getDeclaringClass().getModifiers()) == false) {
targetWriteMethod.setAccessible(true);
}
targetWriteMethod.invoke(targetObj, value);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e1) {
log.error("通用的风格属性名转换时出错\n{}", e1.getMessage());
return null;
}
}
}
}
return targetObj;
}
/**
* 驼峰转下划线
*
* @param camelStr
* @return
*/
public static String camel2Underline(String camelStr) {
if (StringUtils.isEmpty(camelStr)) {
return StringUtils.EMPTY;
}
int len = camelStr.length();
StringBuilder strb = new StringBuilder(len + len >> 1);
for (int i = 0; i < len; i++) {
char c = camelStr.charAt(i);
if (Character.isUpperCase(c)) {
strb.append(UNDERLINE_CHAR);
strb.append(Character.toLowerCase(c));
} else {
strb.append(c);
}
}
return strb.toString();
}
/**
* 下划线转驼峰
*
* @param underlineStr
* @return
*/
public static String underline2Camel(String underlineStr) {
if (StringUtils.isEmpty(underlineStr)) {
return StringUtils.EMPTY;
}
int len = underlineStr.length();
StringBuilder strb = new StringBuilder(len);
for (int i = 0; i < len; i++) {
char c = underlineStr.charAt(i);
if (c == UNDERLINE_CHAR && (++i) < len) {
c = underlineStr.charAt(i);
strb.append(Character.toUpperCase(c));
} else {
strb.append(c);
}
}
return strb.toString();
}
}
分享到:
相关推荐
【Java中驼峰与下划线的转换】在Java编程中,经常需要处理不同命名规范之间的转换,尤其是在数据库与实体类交互的时候。数据库字段通常采用下划线分隔的命名方式,例如`user_name`,而Java实体类的属性则多采用驼峰...
仅支持基本转换:这个基础版本未考虑特定场景,如首字母大写的驼峰命名(PascalCase)转换,或者已有下划线的情况下保持部分单词首字母大写等复杂情况。 不支持数字处理:以上实现并未专门针对带有数字的命名做...
springboot中参数进行驼峰与下划线的自动转换配置,实现参数传入时是下划线、java后台接收变成驼峰、返回前端又转为下划线
在实际开发中,这些转换方法可以方便地用于数据格式的统一,特别是在处理数据库字段名和Java对象属性之间的映射,或者在解析和生成JSON字符串时。确保代码遵循一致的命名规范可以提高代码的可读性,降低维护成本。...
下划线与驼峰相互转换工具
这将启用 MyBatis 的自动命名转换功能,从而将数据库中下划线命名的表和字段转换为 Java 对象的驼峰命名。 方法二:在 Spring Boot 应用程序中添加配置 在 Spring Boot 应用程序的配置文件 `application.yml` 中...
本资源为您推荐一款强大实用的Java工具类,能够帮助您快速地实现字符串驼峰与下划线之间的互转。 2、优点:支持多个复制列编辑,在多列编辑模式下,您只需要简单的复制粘贴即可一次性将多个驼峰或下划线转换成对应...
eclipse选中字符串进行下划线风格与驼峰风格互相转换插件
js字符串驼峰和下划线互相转换,驼峰转换成下划线toHump,下划线转换成驼峰toLine。源代码,直接用实现功能。
下划线(小写) > 驼峰(首字母大写) > 驼峰(首字母小写) > 下划线(大写) > 下划线(小写)>...... user_name > UserName > userName > USER_NAME > user_name >...... 注:本资源谢绝转载,谢绝转载,谢绝转载。
mybatisPlus的queryWrapper查询条件我们一般都是写死带下划线(如:create_time),但是如果用@FieldNameConstants注解的files字段去当条件的话,是驼峰,sql语句报找不到列,所以期望这里会自动帮我们把驼峰转下划线,...
驼峰与下划线互转,下划线转驼峰法,驼峰法转下划线,下划线转驼峰Map集,Map集-驼峰转下划线,驼峰法转下划线List套Map集,下划线转驼峰法List套Map集,下划线转驼峰法List
由于最近的mybatis项目中经常需要新增表字段, 而表字段为下划线风格, javabean字段为驼峰风格, 而eclipse没有自带下划线风格和驼峰风格互转的快捷键, 因此做了这个eclipse插件来实现添加该功能, 我想应该有很多人也...
java郑
idea中已有的下划线与驼峰命名法转换的插件用起来不顺手,自己写了个,比如 sys_user_group_name <> sysUserGroupName 两种命名法来回切换, 切换后的驼峰默认首字母小写,主要是mybatis里面写sql和mode里面的转化用的,...
CamelCase下划线转驼峰, 驼峰转下划线, eclipse插件 1. 下载后就是一个jar文件, 粘贴到eclipse的plugins文件夹重启eclipse 2. 选中eclipse编辑器中的一段内容例如ab_cd_ef按快捷键ctrl+shift+z则会转化为abCdEf, ...
1.驼峰下换线互转 2.拼接前缀、后缀 3.urlencoder、urldecoder
Java 驼峰转换是一种将驼峰命名法转换为下划线命名法的方法,这种方法在 Java 开发中非常常用。驼峰命名法是指将单词的第一个字母大写的命名方法,如 userName,而下划线命名法是指使用下划线将单词分隔的命名方法,...
### Go语言JSON编码:驼峰转下划线与下划线转驼峰的实现 #### 一、背景介绍 在Go语言中,默认情况下,当我们将结构体中的字段转化为JSON格式时,这些字段名称会自动转化为大写驼峰式命名法(Pascal Case),即每个...