diff --git a/CHANGELOG.md b/CHANGELOG.md index 978850aff..00b5799e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ * 【extra 】 修复Archiver路径前带/问题(issue#I4NS0F@Gitee) * 【extra 】 修复getMainColor方法中参数rgbFilters无效问题(pr#2034@Github) * 【core 】 修复ChineseDate无法区分闰月问题(issue#I4NQQW@Gitee) +* 【core 】 修复BeanDesc大小写误判问题(issue#2009@Github) ------------------------------------------------------------------------------------------------------------- # 5.7.17 (2021-12-09) 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 5b32275dd..65411b497 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 @@ -143,7 +143,9 @@ public class BeanDesc implements Serializable { final Method[] methods = ReflectUtil.getMethods(this.beanClass); PropDesc prop; for (Field field : ReflectUtil.getFields(this.beanClass)) { - if (false == ModifierUtil.isStatic(field)) { + if (false == ModifierUtil.isStatic(field) && + // 排除对象子类 + false == "this$0".equals(field.getName())) { //只针对非static属性 prop = createProp(field, methods); // 只有不存在时才放入,防止父类属性覆盖子类属性 @@ -332,7 +334,7 @@ public class BeanDesc implements Serializable { } // 包括boolean的任何类型只有一种匹配情况:name -》 setName - return ("set" + fieldName).equals(methodName); + return ("set" + handledFieldName).equals(methodName); } // ------------------------------------------------------------------------------------------------------ Private method end } diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java index ec0a01d22..1b9afc7cf 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java @@ -272,7 +272,7 @@ public class BeanCopier implements Copier, Serializable { return; } // 检查属性名 - String fieldName = prop.getFieldName(); + final String fieldName = prop.getFieldName(); if (CollUtil.contains(ignoreSet, fieldName)) { // 目标属性值被忽略或值提供者无此key时跳过 return; 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 d05bc13b0..a01dc608b 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 @@ -6,7 +6,9 @@ import cn.hutool.core.bean.copier.ValueProvider; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.map.MapUtil; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import lombok.Data; import lombok.Getter; @@ -14,6 +16,7 @@ import lombok.Setter; import lombok.ToString; import lombok.experimental.Accessors; import org.junit.Assert; +import org.junit.Ignore; import org.junit.Test; import java.beans.PropertyDescriptor; @@ -29,6 +32,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.stream.Collectors; /** * Bean工具单元测试 @@ -307,6 +311,37 @@ public class BeanUtilTest { Assert.assertEquals("sub名字", person1.getSubName()); } + @Test + @Ignore + public void multiThreadTest(){ + Student student = new Student(); + student.setName("张三"); + student.setAge(123); + student.setNo(3158L); + + Student student2 = new Student(); + student.setName("李四"); + student.setAge(125); + student.setNo(8848L); + + List studentList = ListUtil.of(student, student2); + + for (int i=0;i<5000;i++){ + new Thread(()->{ + List list = ObjectUtil.clone(studentList); + List listReps = list.stream().map(s1 -> { + Student s2 = new Student(); + BeanUtil.copyProperties(s1, s2); + return s2; + }).collect(Collectors.toList()); + + System.out.println(listReps); + }).start(); + } + + ThreadUtil.waitForDie(); + } + @Test public void copyPropertiesHasBooleanTest() { SubPerson p1 = new SubPerson(); @@ -652,7 +687,9 @@ public class BeanUtilTest { } @Data - public static class Student { + public static class Student implements Serializable{ + private static final long serialVersionUID = 1L; + String name; int age; Long no; diff --git a/hutool-core/src/test/java/cn/hutool/core/bean/Issue2009Test.java b/hutool-core/src/test/java/cn/hutool/core/bean/Issue2009Test.java new file mode 100644 index 000000000..8ab6a9147 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/bean/Issue2009Test.java @@ -0,0 +1,76 @@ +package cn.hutool.core.bean; + +import org.junit.Assert; +import org.junit.Test; + +/** + * https://github.com/dromara/hutool/issues/2009 + */ +public class Issue2009Test { + + @SuppressWarnings("InnerClassMayBeStatic") + public class BaseA { + private String paPss; + + public String getPaPss() { + return paPss; + } + + public void setPaPss(String paPss) { + this.paPss = paPss; + } + } + + + public class A extends BaseA { + private String papss; + + public String getPapss() { + return papss; + } + + public void setPapss(String papss) { + this.papss = papss; + } + + @Override + public String toString() { + return "A{" + + "papss='" + papss + '\'' + + '}'; + } + } + + + public class B extends BaseA { + private String papss; + + public B(String papss) { + this.papss = papss; + } + + public String getPapss() { + return papss; + } + + public void setPapss(String papss) { + this.papss = papss; + } + + @Override + public String toString() { + return "B{" + + "papss='" + papss + '\'' + + '}'; + } + } + + @Test + public void test() { + B b = new B("a string text"); + A a = new A(); + BeanUtil.copyProperties(b, a); + + Assert.assertEquals(b.getPapss(), a.getPapss()); + } +} diff --git a/hutool-core/src/test/java/cn/hutool/core/img/ImgUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/img/ImgUtilTest.java index 839b3defc..a91e3de6a 100644 --- a/hutool-core/src/test/java/cn/hutool/core/img/ImgUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/img/ImgUtilTest.java @@ -67,9 +67,9 @@ public class ImgUtilTest { @Ignore public void pressImgTest() { ImgUtil.pressImage( - FileUtil.file("d:/test/617180969474805871.jpg"), - FileUtil.file("d:/test/dest.png"), - ImgUtil.read(FileUtil.file("d:/test/vbbb.png")), 0, 0, 0.9f); + FileUtil.file("d:/test/1435859438434136064.jpg"), + FileUtil.file("d:/test/dest.jpg"), + ImgUtil.read(FileUtil.file("d:/test/qrcodeCustom.png")), 0, 0, 0.9f); } @Test