From 995bacc253918422a6fc3e5dc3bdb2e6e71ad7e6 Mon Sep 17 00:00:00 2001 From: xyz327 Date: Tue, 20 Oct 2020 15:27:03 +0800 Subject: [PATCH] =?UTF-8?q?fix(hutool-core):=20=E4=BF=AE=E5=A4=8D=E5=AD=90?= =?UTF-8?q?=E7=B1=BB=E4=BD=BF=E7=94=A8=E5=90=8C=E5=90=8D=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=E8=A6=86=E7=9B=96=E4=BA=86=E7=88=B6=E7=B1=BB=E7=9A=84transient?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E5=AF=BC=E8=87=B4=E5=B1=9E=E6=80=A7transient?= =?UTF-8?q?=E6=A3=80=E6=B5=8B=E8=80=8C=E8=A2=AB=E5=BF=BD=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/bean/BeanDesc.java | 4 ++- .../cn/hutool/core/bean/BeanUtilTest.java | 33 ++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanDesc.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanDesc.java index bdc032736..79cbfb30b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanDesc.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanDesc.java @@ -146,7 +146,9 @@ public class BeanDesc implements Serializable { if (false == ModifierUtil.isStatic(field)) { //只针对非static属性 prop = createProp(field, methods); - this.propMap.put(prop.getFieldName(), prop); + PropDesc finalProp = prop; + // 只有不存在时才放入,防止父类属性覆盖子类属性 + this.propMap.putIfAbsent(prop.getFieldName(), finalProp); } } return this; diff --git a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java index 16284002e..b56e10769 100644 --- a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java @@ -364,12 +364,26 @@ public class BeanUtilTest { @Getter @Setter - public static class Person { + public static class SubPersonWithOverlayTransientField extends PersonWithTransientField { + // 覆盖父类中 transient 属性 private String name; + } + + @Getter + @Setter + public static class Person { + private String name; private int age; private String openid; } + @Getter + @Setter + public static class PersonWithTransientField { + private transient String name; + private int age; + private String openid; + } public static class Person2 { public Person2(String name, int age, String openid) { @@ -383,6 +397,23 @@ public class BeanUtilTest { public String openid; } + /** + * #1173 + */ + @Test + public void beanToBeanOverlayFieldTest() { + SubPersonWithOverlayTransientField source = new SubPersonWithOverlayTransientField(); + source.setName("zhangsan"); + source.setAge(20); + source.setOpenid("1"); + SubPersonWithOverlayTransientField dest = new SubPersonWithOverlayTransientField(); + BeanUtil.copyProperties(source, dest); + + Assert.assertEquals(source.getName(), dest.getName()); + Assert.assertEquals(source.getAge(), dest.getAge()); + Assert.assertEquals(source.getOpenid(), dest.getOpenid()); + } + @Test public void beanToBeanTest() { // 修复对象无getter方法导致报错的问题