您的位置:首页 > 娱乐 > 八卦 > 苏州建站公司 诚找苏州聚尚网络_上海有几个区和县_凡科建站下载_宁波百度快照优化排名

苏州建站公司 诚找苏州聚尚网络_上海有几个区和县_凡科建站下载_宁波百度快照优化排名

2025/1/5 13:11:59 来源:https://blog.csdn.net/qq_53281187/article/details/144887928  浏览:    关键词:苏州建站公司 诚找苏州聚尚网络_上海有几个区和县_凡科建站下载_宁波百度快照优化排名
苏州建站公司 诚找苏州聚尚网络_上海有几个区和县_凡科建站下载_宁波百度快照优化排名

分享一个自定义的BeanUtil,继承的是hutool的工具类,然后自己扩充了几个方法;

1、重写常用的方法,实现了两个对象覆盖非空属性的功能,不需要设置CopyOptions;

2、两个对象,对指定前缀的属性进行拷贝,其中copyExtendProperties就会拷贝对象中的extend1,extend2,extend3...等等。

@Slf4j
@UtilityClass
public class MyBeanUtils extends BeanUtil {/*** 两个对象覆盖非空属性(忽略指定字段)** @param source        源 bean* @param target        目标 bean* @param ignoresFields 忽略的字段列表*/public static <S, T> void overrideNonNullProperties(S source, T target, String... ignoresFields) {Map<String, Object> sourceMap = BeanUtil.beanToMap(source, false, false);Map<String, Object> targetMap = BeanUtil.beanToMap(target, false, false);overrideNonNullPropertiesInternal(sourceMap, target, targetMap, ignoresFields);}/*** 将 Map 赋值非空属性到指定对象(忽略指定字段)** @param sourceMap     源 Map* @param target        目标 bean* @param ignoresFields 忽略的字段列表*/public static <T> void overrideNonNullProperties(Map<String, Object> sourceMap, T target, String... ignoresFields) {Map<String, Object> targetMap = BeanUtil.beanToMap(target, false, false);overrideNonNullPropertiesInternal(sourceMap, target, targetMap, ignoresFields);}/*** 内部方法,处理覆盖非空属性的逻辑** @param sourceMap     源对象的属性映射* @param target        目标对象* @param targetMap     目标对象的属性映射* @param ignoresFields 忽略的字段列表*/private static <T> void overrideNonNullPropertiesInternal(Map<String, Object> sourceMap, T target, Map<String, Object> targetMap, String... ignoresFields) {// 移除忽略的字段Set<String> ignoresSet = Set.of(ignoresFields);for (String field : ignoresFields) {targetMap.remove(field);}// 遍历源对象的属性,只处理非空值sourceMap.forEach((fieldName, value) -> {if (!ignoresSet.contains(fieldName) && value != null) {BeanUtil.setFieldValue(target, fieldName, value);}});}/*** 将源对象的属性通过反射赋值到目标对象(只处理以 "extend" 开头的字段)** @param source 源对象* @param target 目标对象*/public static void copyExtendProperties(Object source, Object target) {copyPropertiesWithPrefix(source, target, "extend");}/*** 将源对象的属性通过反射赋值到目标对象(只处理以指定前缀开头的字段)** @param source             源对象* @param target             目标对象* @param propertyNamePrefix 处理的字段名前缀* @param ignoresFields      忽略的字段列表*/public static void copyPropertiesWithPrefix(Object source, Object target, String propertyNamePrefix, String... ignoresFields) {Field[] fields = source.getClass().getDeclaredFields();Set<String> ignoresSet = Set.of(ignoresFields);for (Field field : fields) {String fieldName = field.getName();if (fieldName.startsWith(propertyNamePrefix)) {try {ReflectionUtils.makeAccessible(field);Object value = field.get(source);if (value != null) {Field targetField = getTargetField(fieldName, target.getClass());if (targetField != null && !ignoresSet.contains(fieldName)) {ReflectionUtils.makeAccessible(targetField);ReflectionUtils.setField(targetField, target, value);}}} catch (IllegalAccessException e) {log.error("非法访问字段: {}", fieldName, e);}}}}/*** 安全地获取目标对象中的字段。** @param fieldName 字段名* @param clazz     目标对象的类对象* @return 目标字段或null(如果未找到)*/private static Field getTargetField(String fieldName, Class<?> clazz) {try {Field field = ReflectionUtils.findField(clazz, fieldName);if (field == null) {log.debug("目标对象中未找到字段: {}", fieldName);}return field;} catch (Exception e) {log.error("获取目标字段异常: {}", fieldName, e);return null;}}
}

ps:以下是我整理的java面试资料,感兴趣的可以看看。最后,创作不易,觉得写得不错的可以点点关注!

链接:https://www.yuque.com/u39298356/uu4hxh?# 《Java知识宝典》 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com