iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java 如何复制非空对象属性值
  • 288
分享到

java 如何复制非空对象属性值

2024-04-02 19:04:59 288人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录java复制非空对象属性值然后封装一下得到以下方法测试方法就不提供了,自行测试即可java对象属性复制的几种方式1.使用java反射机制2.使用spring-beans5.0.8

java 复制非空对象属性值

很多时候,我们需要通过对象拷贝,比如说VO类与数据库实体bean类、更新时非空对象不更新,对同一对象不同数据分开存储等

用于对象拷贝,spring 和 Apache都提供了相应的工具类方法,BeanUtils.copyProperties

但是对于非空属性拷贝就需要自己处理了

在这里借用spring中org.springframework.beans.BeanUtils类提供的方法

copyProperties(Object source, Object target, String... ignoreProperties)



    public static void copyProperties(Object source, Object target, String... ignoreProperties) throws BeansException {
        copyProperties(source, target, null, ignoreProperties);
 

    private static void copyProperties(Object source, Object target, Class<?> editable, String... ignoreProperties)
            throws BeansException {
 
        Assert.notNull(source, "Source must not be null");
        Assert.notNull(target, "Target must not be null");
 
        Class<?> actualEditable = target.getClass();
        if (editable != null) {
            if (!editable.isInstance(target)) {
                throw new IllegalArgumentException("Target class [" + target.getClass().getName() +
                        "] not assignable to Editable class [" + editable.getName() + "]");
            }
            actualEditable = editable;
        }
        PropertyDescriptor[] targetPds = getPropertyDescriptors(actualEditable);
        List<String> ignoreList = (ignoreProperties != null ? Arrays.asList(ignoreProperties) : null);
 
        for (PropertyDescriptor targetPd : targetPds) {
            Method writeMethod = targetPd.getWriteMethod();
            if (writeMethod != null && (ignoreList == null || !ignoreList.contains(targetPd.getName()))) {
                PropertyDescriptor sourcePd = getPropertyDescriptor(source.getClass(), targetPd.getName());
                if (sourcePd != null) {
                    Method readMethod = sourcePd.getReadMethod();
                    if (readMethod != null &&
                            ClassUtils.isAssignable(writeMethod.getParameterTypes()[0], readMethod.getReturnType())) {
                        try {
                            if (!Modifier.isPublic(readMethod.getDeclarinGClass().getModifiers())) {
                                readMethod.setAccessible(true);
                            }
                            Object value = readMethod.invoke(source);
                            if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {
                                writeMethod.setAccessible(true);
                            }
                            writeMethod.invoke(target, value);
                        }
                        catch (Throwable ex) {
                            throw new FatalBeanException(
                                    "Could not copy property '" + targetPd.getName() + "' from source to target", ex);
                        }
                    }
                }
            }
        }
    }

然后封装一下得到以下方法



    public static String[] getNullPropertyNames(Object source) {
        final BeanWrapper src = new BeanWrapperImpl(source);
        java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
 
        Set<String> emptyNames = new HashSet<String>();
        for (java.beans.PropertyDescriptor pd : pds) {
            Object srcValue = src.getPropertyValue(pd.getName());
            if (srcValue == null)
                emptyNames.add(pd.getName());
        }
        String[] result = new String[emptyNames.size()];
        return emptyNames.toArray(result);
    }
 
    
    public static void copyPropertiesIgnoreNull(Object source, Object target) {
        BeanUtils.copyProperties(source, target, getNullPropertyNames(source));
    }

测试方法就不提供了,自行测试即可

如果项目中使用的框架有Hibernate的话,则可以通过在实体类上添加下面两条注解


@DynamicInsert(true)
@DynamicUpdate(true)

如果想对该注解进一步了解的话,那么可以去官网看英文文档,文档解释的很清楚,在此不再赘述了

java对象属性复制的几种方式

1.使用java反射机制

获取对象的属性和get、set方法进行复制;

2.使用spring-beans5.0.8包中的BeanUtils类


import org.springframework.beans.BeanUtils;
SourceObject sourceObject = new SourceObject();
TargetObject targetObject = new TargetObject();
BeanUtils.copyProperties(sourceObject, targetObject);

3.使用cglib3.2.8包中的net.sf.cglib.beans.BeanCopier类


import net.sf.cglib.beans.BeanCopier;
import net.sf.cglib.core.Converter;
SourceObject sourceObject = new SourceObject();
TargetObject targetObject = new TargetObject();
BeanCopier beanCopier = BeanCopier.create(SourceObject.class, TargetObject.class, true);--第三个参数表示是否使用转换器,false表示不使用,true表示使用
Converter converter = new CopyConverter();--自定义转换器
beanCopier.copy(sourceObject, targetObject, converter);

转换器(当源对象属性类型与目标对象属性类型不一致时,使用转换器):


import net.sf.cglib.core.Converter;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.util.Date;

public class CopyConverter implements Converter {
    @Override
    public Object convert(Object value, Class target, Object context) {
        {
            String s = value.toString();
            if (target.equals(int.class) || target.equals(Integer.class)) {
                return Integer.parseInt(s);
            }
            if (target.equals(long.class) || target.equals(Long.class)) {
                return Long.parseLong(s);
            }
            if (target.equals(float.class) || target.equals(Float.class)) {
                return Float.parseFloat(s);
            }
            if (target.equals(double.class) || target.equals(Double.class)) {
                return Double.parseDouble(s);
            }
            if(target.equals(Date.class)){
                while(s.indexOf("-")>0){
                    s = s.replace("-", "/");
                }
                return  new Date(s);
            }
            if(target.equals(BigDecimal.class)){
                if(!StringUtils.isEmpty(s)&&!s.equals("NaN")){
                    return  new BigDecimal(s);
                }
            }
            return value ;
        }
    }
}

4.使用spring-core5.0.8包

中的org.springframework.cglib.beans.BeanCopier类(用法与第三种一样)


import org.springframework.cglib.beans.BeanCopier;
import org.springframework.cglib.core.Converter;
SourceObject sourceObject = new SourceObject();
TargetObject targetObject = new TargetObject();
Converter converter = new SpringCopyConverter();
BeanCopier beanCopier = BeanCopier.create(SourceObject.class, TargetObject.class, true);
beanCopier.copy(sourceObject, targetObject, converter);

经过循环复制测试(源对象与目标对象各160个属性):

  • 第一种:Java反射通过判断属性类型,常用类型的属性值都能复制,但是不优化的前提下效率最慢;
  • 第二种:属性类型不同时无法复制,且效率相对较慢;
  • 第三种:耗时最少,不使用转换器时,属性类型不同时无法复制,使用转换器后,耗时会相对变长;
  • 第四种:与第三种相似,但是耗时相对较长;

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: java 如何复制非空对象属性值

本文链接: https://www.lsjlt.com/news/134248.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java 如何复制非空对象属性值
    目录java复制非空对象属性值然后封装一下得到以下方法测试方法就不提供了,自行测试即可java对象属性复制的几种方式1.使用java反射机制2.使用spring-beans5.0.8...
    99+
    2024-04-02
  • JAVA对象的属性自动复制
    在JAVA编程的WEB开发和UPDATE过程当中,通常的做法是先load出数据库的原值,然后再把页面的值更新数据库中数据,如果页面对象的存储值不够(相对数据库LOAD出来的对象),那么就有可能在更新时用NULL把原值覆盖,针对上面的情况自己...
    99+
    2023-06-03
  • java中怎么将对象属性值都清空
    可以使用以下两种方法将Java对象的属性值都清空:1. 使用构造函数重新创建一个新的对象:可以通过创建一个新的对象来清空原对象的属性...
    99+
    2023-09-26
    java
  • java中给实体对象属性的空值赋默认值
    目录给实体对象属性的空值赋默认值给实体类赋默认值通用方法给实体对象属性的空值赋默认值 private final String defaultStr = ""; private fi...
    99+
    2024-04-02
  • java如何删除对象属性
    在Java中,要删除对象的属性,可以使用以下方法:1. 将属性设置为null:可以将属性的引用设置为null,表示对象不再引用该属性...
    99+
    2023-10-18
    java
  • react如何修改对象的属性值
    这篇文章主要讲解了“react如何修改对象的属性值”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“react如何修改对象的属性值”吧!react修改对象属性值的方法:1、打开相应的react代...
    99+
    2023-07-04
  • java 对象List中对象的某一属性重新赋值
    描述: 在我们开发过程中经常会遇到在拿到一个对象list集合的时候回对某一个字段重新赋值,比如:在无任务下面的若干子任务,开始执行主任务对子任务的状态统一设置待执行。这个时候就需要使用 Java8 s...
    99+
    2023-09-01
    java
  • java使用反射给对象属性赋值
    📢 📢 📢 📣 📣 📣 哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步...
    99+
    2023-09-02
    java 反射 Powered by 金山文档
  • Java 反射设置/获取对象属性值
    ✨大家好,我是【zhuzicc】~ ,一位主攻【Java】的 攻城狮!✨ 欢迎对【Java】感兴趣的大佬,关注我 😜 ———————————————— ❤️ ❤️ ❤️ 如果觉得...
    99+
    2023-10-20
    java jvm servlet
  • java反射给对象属性赋值怎么实现
    Java反射可以通过`java.lang.reflect.Field`类来给对象的属性赋值。以下是一个示例代码: import ja...
    99+
    2023-10-27
    java
  • java怎么使用反射给对象属性赋值
    本文小编为大家详细介绍“java怎么使用反射给对象属性赋值”,内容详细,步骤清晰,细节处理妥当,希望这篇“java怎么使用反射给对象属性赋值”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。前言最近项目中遇到一个问题...
    99+
    2023-07-05
  • 怎么使用java反射获取对象属性值
    使用Java反射获取对象属性值的步骤如下:1. 获取对象的Class对象,可以通过对象的getClass()方法获取。```java...
    99+
    2023-09-26
    java
  • java在创建对象时怎么给属性赋值
    在Java中,可以通过以下几种方式给对象的属性赋值:1. 使用构造方法:在创建对象时,通过传递参数给构造方法来赋值。例如:javap...
    99+
    2023-10-18
    java
  • JS对象数组中如何匹配某个属性值
    目录对象数组中匹配某个属性值对象数组取出对象属性值完全一样的项对象数组中匹配某个属性值 如果有一个js对象数组,一个变量如下 var a = [     {         'id'...
    99+
    2024-04-02
  • 如何在PHP中修改对象数组属性的值
    一、简介在PHP中,一个对象可能包含多个属性,这些属性可以是不同的数据类型,包括字符串、数字、数组等。在开发过程中,可能需要修改某个对象的属性值。本文将介绍如何在PHP中修改对象数组属性的值。二、代码示例考虑下面这个简单的PHP类:clas...
    99+
    2023-05-14
  • vue如何遍历对象属性
    这篇文章主要介绍“vue如何遍历对象属性”,在日常操作中,相信很多人在vue如何遍历对象属性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue如何遍历对象属性”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-07-04
  • java中判断对象中某个属性是否为空
    问题:java对象接受从数据库查出来的数据时,对对象的某一属性进行操作,在操作属性中存储的数据中不对进行检查,会出现空指针异常的情况。 问题再现:新建一个实体类 public class Student { private Integ...
    99+
    2023-09-11
    java 开发语言 mysql
  • js数组对象里面如何获取某个属性值相等的对象
    目录js数组对象里面获取某个属性值相等的对象js获取两个数组及数组对象中相同和不相同的值总结js数组对象里面获取某个属性值相等的对象 例: var outArr=[ {"name"...
    99+
    2023-05-16
    js数组对象 js属性值 js获取属性值对象
  • Java 用反射设置对象的属性值实例详解
    Java 用反射设置对象的属性值实例详解private Object invoke(Object obj, String fieldName, Object value) { String firstWord = fieldName.su...
    99+
    2023-05-31
    java 反射 对象
  • javascript如何删除对象的属性
    这篇文章主要介绍了javascript如何删除对象的属性,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在javascript中,可以使用delete运算符来删除对象的属性,它...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作