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方法导致报错的问题