BeanUtils.copyProperties-Nutzungsanalyse

Überblick

derzeit geöffnet,常使用 BeanUtils.copyProperties() 进行PO,VO,DTO等对象的复制和转换.

Beachten

使用 Spring 的 BeanUtils # CopyProperties-Methode geht zu 拷贝对象属性时, 需要对应的属性有 getter 和 setter 方法 (in der internen Implementierung verwenden Sie Reflektion, um die Set- und Get-Methoden abzurufen, und dann get/set der Eigenschaftswert );

Wenn存在属性完全相同得内部类,但不是同一个内部类 (das heißt, sie gehören zu ihren jeweiligen inneren Klassen), dann sindSpring 会认为属性不同,不会Copy;
Generics nur kompiliert. Es funktioniert zur Laufzeit und kann sich nicht auf Generika verlassen, um Laufzeitbeschränkungen aufzuerlegen;

Spring 和 Apache 的 copy 属性得方法源和目的参数得位置正好相反Daher müssen Sie beim Importieren von Paketen und beim Aufrufen darauf achten

Beim Kopieren von Attributen低版本的 Apache CommonsBeanUtils 为了解决 Date 为空的问题,会导致为目标对象的原始类型的包装类属性赋予初始值. Zum Beispiel wird dem Integer-Attribut der Standardwert 0 zugewiesen, obwohl der Wert dieses Felds in Ihrem Quellobjekt null ist.

Vorteil

简化代码

Wenn Sie die Änderungsmethode nicht verwenden, führt das Kopieren der Daten in einem Objekt in ein anderes Objekt zu vielen Get- und Set-Methoden, wodurch der Code sehr aufgebläht aussieht.

Mangel

Der Nachteil ist, dass die Verwendung von BeanUtils überraschend teuer ist! BeanUtils nehmen mehr Zeit in Anspruch, als die Daten abzurufen, sie in das entsprechende destObject-Objekt zu kopieren (durch manuelles Aufrufen der get- und set-Methoden) und sie zurück an den Remote-Client zu serialisieren.

Der Unterschied zwischen Spring und Apache copyProperties

两者参数顺序不一样,在使用时一定要注意这个区别

org.springframework.beans.BeanUtils

Der Quellcode lautet wie folgt

// Spring 将源对象中的值拷贝到目标对象 
// 注意,目标对象在后。
public static void copyProperties(Object source, Object target) throws BeansException {
   
    
    
   copyProperties(source, target, (Class)null, (String[])null);
}

private static void copyProperties(Object source, Object target, @Nullable Class<?> editable, @Nullable 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 !&

Guess you like

Origin blog.csdn.net/yyuggjggg/article/details/133986389