From 398b7b76a5558ca3a38cc2edd2b81ce9617c95d3 Mon Sep 17 00:00:00 2001 From: redkale Date: Wed, 13 Dec 2023 15:22:45 +0800 Subject: [PATCH] copier --- src/main/java/org/redkale/util/Copier.java | 30 ++++++++++++++++------ 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/redkale/util/Copier.java b/src/main/java/org/redkale/util/Copier.java index f289624e5..7dbc3ef74 100644 --- a/src/main/java/org/redkale/util/Copier.java +++ b/src/main/java/org/redkale/util/Copier.java @@ -820,6 +820,7 @@ public interface Copier extends BiFunction { } Predicate simpler = t -> t.isPrimitive() || t == String.class || Number.class.isAssignableFrom(t); + //遍历所有字段 for (Map.Entry en : elements.entrySet()) { if (!(en.getValue() instanceof java.lang.reflect.Field)) { continue; @@ -929,19 +930,25 @@ public interface Copier extends BiFunction { Asms.visitPrimitiveValueOf(mv, srcFieldType); mv.visitMethodInsn(INVOKESTATIC, utilClassName, "convertValue", "(Ljava/lang/reflect/Type;Ljava/lang/Object;)Ljava/lang/Object;", false); Asms.visitCheckCast(mv, destFieldType); - if (setter == null) { //src: field, dest:field + if (setter == null) { //src: field, dest: field mv.visitFieldInsn(PUTFIELD, destClassName, dfname, Type.getDescriptor(destFieldType)); - } else { //src: field, dest:method + } else { //src: field, dest: method mv.visitMethodInsn(destClass.isInterface() ? INVOKEINTERFACE : INVOKEVIRTUAL, destClassName, setter.getName(), Type.getMethodDescriptor(setter), destClass.isInterface()); + if (setter.getReturnType() != void.class) { + mv.visitInsn(POP); + } } } else { mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ALOAD, 1); mv.visitFieldInsn(GETFIELD, srcClassName, sfname, srcFieldDesc); - if (setter == null) { //src: field, dest:field + if (setter == null) { //src: field, dest: field mv.visitFieldInsn(PUTFIELD, destClassName, dfname, Type.getDescriptor(destFieldType)); - } else { //src: field, dest:method + } else { //src: field, dest: method mv.visitMethodInsn(destClass.isInterface() ? INVOKEINTERFACE : INVOKEVIRTUAL, destClassName, setter.getName(), Type.getMethodDescriptor(setter), destClass.isInterface()); + if (setter.getReturnType() != void.class) { + mv.visitInsn(POP); + } } } } else { // skipNullValue OR (skipEmptyString && charstr) @@ -964,19 +971,25 @@ public interface Copier extends BiFunction { Asms.visitPrimitiveValueOf(mv, srcFieldType); mv.visitMethodInsn(INVOKESTATIC, utilClassName, "convertValue", "(Ljava/lang/reflect/Type;Ljava/lang/Object;)Ljava/lang/Object;", false); Asms.visitCheckCast(mv, destFieldType); - if (setter == null) { //src: field, dest:field + if (setter == null) { //src: field, dest: field mv.visitFieldInsn(PUTFIELD, destClassName, dfname, Type.getDescriptor(destFieldType)); - } else { //src: field, dest:method + } else { //src: field, dest: method mv.visitMethodInsn(destClass.isInterface() ? INVOKEINTERFACE : INVOKEVIRTUAL, destClassName, setter.getName(), Type.getMethodDescriptor(setter), destClass.isInterface()); + if (setter.getReturnType() != void.class) { + mv.visitInsn(POP); + } } } else { mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ALOAD, 3); mv.visitTypeInsn(CHECKCAST, srcFieldType.getName().replace('.', '/')); - if (setter == null) { //src: field, dest:field + if (setter == null) { //src: field, dest: field mv.visitFieldInsn(PUTFIELD, destClassName, dfname, srcFieldDesc); - } else { //src: field, dest:method + } else { //src: field, dest: method mv.visitMethodInsn(destClass.isInterface() ? INVOKEINTERFACE : INVOKEVIRTUAL, destClassName, setter.getName(), Type.getMethodDescriptor(setter), destClass.isInterface()); + if (setter.getReturnType() != void.class) { + mv.visitInsn(POP); + } } } mv.visitLabel(ifLabel); @@ -984,6 +997,7 @@ public interface Copier extends BiFunction { } } } + //遍历所有方法 for (Map.Entry en : elements.entrySet()) { if (!(en.getValue() instanceof java.lang.reflect.Method)) { continue;