From 1547e6b714996d2be314c35c7a0a0e86c5fd52f3 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Thu, 29 Mar 2018 08:33:55 +0800 Subject: [PATCH] =?UTF-8?q?Reproduce=E6=94=AF=E6=8C=81public=20field?= =?UTF-8?q?=E5=92=8Csetter=E3=80=81getter=E6=B7=B7=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/org/redkale/util/Reproduce.java | 48 ++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/src/org/redkale/util/Reproduce.java b/src/org/redkale/util/Reproduce.java index 90dd2e185..1a87d0e5d 100644 --- a/src/org/redkale/util/Reproduce.java +++ b/src/org/redkale/util/Reproduce.java @@ -9,7 +9,6 @@ import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES; /** * JavaBean类对象的拷贝,相同的字段名会被拷贝
- * 注意: 拷贝类与被拷贝类的字段可见模式必须一致, 要么都是public field, 要么都是getter、setter模式。
* *

* 详情见: https://redkale.org @@ -90,18 +89,31 @@ public interface Reproduce extends BiFunction { if (Modifier.isFinal(field.getModifiers())) continue; if (!Modifier.isPublic(field.getModifiers())) continue; final String sfname = field.getName(); + if (srcColumnPredicate != null && !srcColumnPredicate.test(srcClass, sfname)) continue; + final String dfname = names == null ? sfname : names.getOrDefault(sfname, sfname); + java.lang.reflect.Method setter = null; try { - if (!srcColumnPredicate.test(srcClass, sfname)) continue; if (!field.getType().equals(destClass.getField(dfname).getType())) continue; } catch (Exception e) { - continue; + try { + char[] cs = dfname.toCharArray(); + cs[0] = Character.toUpperCase(cs[0]); + String dfname2 = new String(cs); + setter = destClass.getMethod("set" + dfname2, field.getType()); + } catch (Exception e2) { + continue; + } } mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 2); String td = Type.getDescriptor(field.getType()); mv.visitFieldInsn(GETFIELD, srcClassName, sfname, td); - mv.visitFieldInsn(PUTFIELD, destClassName, dfname, td); + if (setter == null) { + mv.visitFieldInsn(PUTFIELD, destClassName, dfname, td); + } else { + mv.visitMethodInsn(INVOKEVIRTUAL, destClassName, setter.getName(), Type.getMethodDescriptor(setter), false); + } } for (java.lang.reflect.Method getter : srcClass.getMethods()) { @@ -109,7 +121,6 @@ public interface Reproduce extends BiFunction { if (getter.getParameterTypes().length > 0) continue; if ("getClass".equals(getter.getName())) continue; if (!getter.getName().startsWith("get") && !getter.getName().startsWith("is")) continue; - java.lang.reflect.Method setter; final boolean is = getter.getName().startsWith("is"); String sfname = getter.getName().substring(is ? 2 : 3); if (sfname.length() < 2 || Character.isLowerCase(sfname.charAt(1))) { @@ -119,21 +130,30 @@ public interface Reproduce extends BiFunction { } if (srcColumnPredicate != null && !srcColumnPredicate.test(srcClass, sfname)) continue; - String dfname = names == null ? sfname : names.getOrDefault(sfname, sfname); - { - char[] cs = dfname.toCharArray(); - cs[0] = Character.toUpperCase(cs[0]); - dfname = new String(cs); - } + final String dfname = names == null ? sfname : names.getOrDefault(sfname, sfname); + java.lang.reflect.Method setter = null; + java.lang.reflect.Field srcField = null; + char[] cs = dfname.toCharArray(); + cs[0] = Character.toUpperCase(cs[0]); + String dfname2 = new String(cs); try { - setter = destClass.getMethod("set" + dfname, getter.getReturnType()); + setter = destClass.getMethod("set" + dfname2, getter.getReturnType()); } catch (Exception e) { - continue; + try { + srcField = destClass.getField(dfname); + if (!getter.getReturnType().equals(srcField.getType())) continue; + } catch (Exception e2) { + continue; + } } mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, srcClassName, getter.getName(), Type.getMethodDescriptor(getter), false); - mv.visitMethodInsn(INVOKEVIRTUAL, destClassName, setter.getName(), Type.getMethodDescriptor(setter), false); + if (srcField == null) { + mv.visitMethodInsn(INVOKEVIRTUAL, destClassName, setter.getName(), Type.getMethodDescriptor(setter), false); + } else { + mv.visitFieldInsn(PUTFIELD, destClassName, dfname, Type.getDescriptor(getter.getReturnType())); + } } mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ARETURN);