From 2cfb33af9eeac7869e180c496ac1c427f77fa903 Mon Sep 17 00:00:00 2001 From: jiazhengquan <2466896229@qq.com> Date: Tue, 8 Mar 2022 18:01:07 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E9=92=88=E5=AF=B9issue#I4WUWR=E5=88=9D?= =?UTF-8?q?=E7=89=88=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/util/ReflectUtil.java | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java index de406bfbf..4f9ded9d2 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java @@ -663,18 +663,35 @@ public class ReflectUtil { Assert.notNull(beanClass); Method[] allMethods = null; + Class[] searchInterfaces = null, parentInterfaces = null; Class searchType = beanClass; Method[] declaredMethods; - while (searchType != null) { - declaredMethods = searchType.getDeclaredMethods(); - if (null == allMethods) { - allMethods = declaredMethods; - } else { - allMethods = ArrayUtil.append(allMethods, declaredMethods); + while (searchType != null || searchInterfaces != null) { + if (searchType != null) { + declaredMethods = searchType.getDeclaredMethods(); + if (null == allMethods) { + allMethods = declaredMethods; + } else { + allMethods = ArrayUtil.append(allMethods, declaredMethods); + } + Class[] interfaces = searchType.getInterfaces(); + for (Class element : interfaces) { + allMethods = ArrayUtil.append(allMethods, element.getDeclaredMethods()); + parentInterfaces = ArrayUtil.addAll(element.getInterfaces()); + } + searchInterfaces = parentInterfaces; + Class[] classes = searchInterfaces.length == 0 ? null : searchInterfaces; + searchInterfaces = withSuperClassMethods ? classes : null; + searchType = withSuperClassMethods ? searchType.getSuperclass() : null; + } + if (searchInterfaces != null) { + for (Class searchInterface : searchInterfaces) { + allMethods = ArrayUtil.append(allMethods, searchInterface.getDeclaredMethods()); + parentInterfaces = ArrayUtil.addAll(searchInterface.getInterfaces()); + } + searchInterfaces = parentInterfaces.length == 0 ? null : parentInterfaces; } - searchType = withSuperClassMethods ? searchType.getSuperclass() : null; } - return allMethods; } From 1aeb56564f38826d575e63e4e52298b9784c484e Mon Sep 17 00:00:00 2001 From: jiazhengquan <2466896229@qq.com> Date: Wed, 9 Mar 2022 11:25:52 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E9=92=88=E5=AF=B9issue#I4WUWR=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/util/ReflectUtil.java | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java index 4f9ded9d2..dbad1e91d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java @@ -663,34 +663,34 @@ public class ReflectUtil { Assert.notNull(beanClass); Method[] allMethods = null; - Class[] searchInterfaces = null, parentInterfaces = null; Class searchType = beanClass; + Class[] tempInterfaceType, interfaceType; Method[] declaredMethods; - while (searchType != null || searchInterfaces != null) { - if (searchType != null) { + if (searchType.isInterface()) { + allMethods = searchType.getDeclaredMethods(); + interfaceType = searchType.getInterfaces(); + while (ArrayUtil.isNotEmpty(interfaceType)) { + tempInterfaceType = interfaceType; + for (int i = 0; i < tempInterfaceType.length; i++) { + Class temp = tempInterfaceType[i]; + allMethods = ArrayUtil.append(allMethods, temp.getDeclaredMethods()); + if (i == 0 || ArrayUtil.isEmpty(interfaceType)) { + interfaceType = temp.getInterfaces(); + } else { + interfaceType = ArrayUtil.append(interfaceType, temp.getInterfaces()); + } + } + } + } else { + while (searchType != null) { declaredMethods = searchType.getDeclaredMethods(); if (null == allMethods) { allMethods = declaredMethods; } else { allMethods = ArrayUtil.append(allMethods, declaredMethods); } - Class[] interfaces = searchType.getInterfaces(); - for (Class element : interfaces) { - allMethods = ArrayUtil.append(allMethods, element.getDeclaredMethods()); - parentInterfaces = ArrayUtil.addAll(element.getInterfaces()); - } - searchInterfaces = parentInterfaces; - Class[] classes = searchInterfaces.length == 0 ? null : searchInterfaces; - searchInterfaces = withSuperClassMethods ? classes : null; searchType = withSuperClassMethods ? searchType.getSuperclass() : null; } - if (searchInterfaces != null) { - for (Class searchInterface : searchInterfaces) { - allMethods = ArrayUtil.append(allMethods, searchInterface.getDeclaredMethods()); - parentInterfaces = ArrayUtil.addAll(searchInterface.getInterfaces()); - } - searchInterfaces = parentInterfaces.length == 0 ? null : parentInterfaces; - } } return allMethods; } From 04ae795ce651589223a85e89246bc9bd08c82504 Mon Sep 17 00:00:00 2001 From: jiazhengquan <2466896229@qq.com> Date: Fri, 11 Mar 2022 09:50:37 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E9=92=88=E5=AF=B9issue#I4X9TT=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hutool-core/src/main/java/cn/hutool/core/text/NamingCase.java | 2 +- hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/text/NamingCase.java b/hutool-core/src/main/java/cn/hutool/core/text/NamingCase.java index a35d78f1e..a5c7a5d52 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/NamingCase.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/NamingCase.java @@ -97,7 +97,7 @@ public class NamingCase { // 后一个为大写,按照专有名词对待,如aBC -> a_BC } else { //前一个为大写 - if (null == nextChar || Character.isLowerCase(nextChar)) { + if (null != nextChar && Character.isLowerCase(nextChar)) { // 普通首字母大写,如ABcc -> A_bcc sb.append(symbol); c = Character.toLowerCase(c); diff --git a/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java index ee1e1da50..2dcef2850 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java @@ -422,6 +422,7 @@ public class StrUtilTest { .set("H2", "H2") .set("H#case", "H#case") .set("PNLabel", "PN_label") + .set("DEPT_NAME","DEPT_NAME") .forEach((key, value) -> Assert.assertEquals(value, StrUtil.toUnderlineCase(key))); } From 78f886075eb45b1fdeca88cc0ace0f9aefcc4ff5 Mon Sep 17 00:00:00 2001 From: jiazhengquan <2466896229@qq.com> Date: Fri, 11 Mar 2022 17:51:09 +0800 Subject: [PATCH 4/6] =?UTF-8?q?issue=20#I4XG4L=20=E5=88=9D=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/util/ArrayUtil.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java index 8c948e8a9..01e4ea721 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java @@ -368,6 +368,43 @@ public class ArrayUtil extends PrimitiveArrayUtil { } } + /** + * 将元素值设置为数组的某个位置,根据元素顺序添加
+ * 当给定的index大于数组长度,则追加 + * + * @param 数组元素类型 + * @param buffer 已有数组 + * @param index 位置,大于长度追加,否则替换 + * @param values 新值 + * @return 新数组或原有数组 + */ + public static T[] replace(T[] buffer, int index, T... values) { + return index == 0 ? values : replaceBy(buffer, index, values); + } + + /** + * 将元素值设置为数组的某个位置,根据元素顺序添加
+ * 当给定的index大于数组长度,则追加 + * + * @param 数组元素类型 + * @param buffer 已有数组 + * @param index 位置,大于长度追加,否则替换 + * @param values 新值 + * @return 新数组或原有数组 + */ + public static T[] replaceBy(T[] buffer, int index, T... values) { + if (index < buffer.length && buffer.length - index - 1 >= values.length) { + for (int i = index; i < values.length; i++) { + Array.set(buffer, index, values[i]); + } + return buffer; + } else { + final T[] result = (T[]) Array.newInstance(buffer.getClass().getComponentType(), buffer.length - index - 1); + System.arraycopy(buffer, 0, result, 0, buffer.length - index - 1); + return append(result, values); + } + } + /** * 将新元素插入到到已有数组中的某个位置
* 添加新元素会生成一个新的数组,不影响原数组
From c62d4d382acb0b25555e5f1d9a980b787edb2adf Mon Sep 17 00:00:00 2001 From: Husky <2466896229@qq.com> Date: Sun, 13 Mar 2022 23:07:41 +0800 Subject: [PATCH 5/6] =?UTF-8?q?https://gitee.com/dromara/hutool/issues/I4X?= =?UTF-8?q?G4L=E5=88=9D=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/util/ArrayUtil.java | 57 ++++++++------- .../cn/hutool/core/util/ArrayUtilTest.java | 72 ++++++++++++++++--- 2 files changed, 93 insertions(+), 36 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java index 01e4ea721..0c67d6522 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java @@ -369,8 +369,9 @@ public class ArrayUtil extends PrimitiveArrayUtil { } /** - * 将元素值设置为数组的某个位置,根据元素顺序添加
- * 当给定的index大于数组长度,则追加 + * 将新元素插入到到已有数组中的某个位置
+ * 添加新元素会生成一个新数组或原有数组
+ * 如果插入位置为为负数,那么生成一个由插入元素顺序加已有数组顺序的新数组 * * @param 数组元素类型 * @param buffer 已有数组 @@ -378,31 +379,33 @@ public class ArrayUtil extends PrimitiveArrayUtil { * @param values 新值 * @return 新数组或原有数组 */ + @SuppressWarnings({"unchecked", "SuspiciousSystemArraycopy"}) public static T[] replace(T[] buffer, int index, T... values) { - return index == 0 ? values : replaceBy(buffer, index, values); - } - - /** - * 将元素值设置为数组的某个位置,根据元素顺序添加
- * 当给定的index大于数组长度,则追加 - * - * @param 数组元素类型 - * @param buffer 已有数组 - * @param index 位置,大于长度追加,否则替换 - * @param values 新值 - * @return 新数组或原有数组 - */ - public static T[] replaceBy(T[] buffer, int index, T... values) { - if (index < buffer.length && buffer.length - index - 1 >= values.length) { - for (int i = index; i < values.length; i++) { - Array.set(buffer, index, values[i]); + if (index < 0) { + return insert(buffer, 0, values); + } + if (isEmpty(buffer) || index == 0 && isNotEmpty(values)) { + return values; + } + if (index >= buffer.length || isEmpty(values)) { + return append(buffer, values); + } + int replaceSpace = buffer.length - index - 1; + if (replaceSpace > values.length) { + for (int i = index - 1; i < values.length; i++) { + Array.set(buffer, i + 1, values[i]); } return buffer; - } else { - final T[] result = (T[]) Array.newInstance(buffer.getClass().getComponentType(), buffer.length - index - 1); - System.arraycopy(buffer, 0, result, 0, buffer.length - index - 1); - return append(result, values); } + int newArrayLength = index + values.length; + final T[] result = (T[]) Array.newInstance(buffer.getClass().getComponentType(), newArrayLength); + System.arraycopy(buffer, 0, result, 0, index); + int valueIndex = 0; + for (int i = index; i < newArrayLength; i++) { + Array.set(result, i, values[valueIndex]); + valueIndex = valueIndex + 1; + } + return result; } /** @@ -1577,7 +1580,7 @@ public class ArrayUtil extends PrimitiveArrayUtil { * @since 4.5.18 */ public static boolean isAllEmpty(Object... args) { - for (Object obj: args) { + for (Object obj : args) { if (false == ObjectUtil.isEmpty(obj)) { return false; } @@ -1795,10 +1798,10 @@ public class ArrayUtil extends PrimitiveArrayUtil { /** * 查找最后一个子数组的开始位置 * - * @param array 数组 + * @param array 数组 * @param endInclude 查找结束的位置(包含) - * @param subArray 子数组 - * @param 数组元素类型 + * @param subArray 子数组 + * @param 数组元素类型 * @return 最后一个子数组的开始位置,即子数字第一个元素在数组中的位置 * @since 5.4.8 */ diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java index 3ba18becf..e2ce30b9e 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java @@ -363,7 +363,7 @@ public class ArrayUtilTest { } @Test - public void indexOfSubTest2(){ + public void indexOfSubTest2() { Integer[] a = {0x12, 0x56, 0x34, 0x56, 0x78, 0x9A}; Integer[] b = {0x56, 0x78}; int i = ArrayUtil.indexOfSub(a, b); @@ -401,7 +401,7 @@ public class ArrayUtilTest { } @Test - public void lastIndexOfSubTest2(){ + public void lastIndexOfSubTest2() { Integer[] a = {0x12, 0x56, 0x78, 0x56, 0x21, 0x9A}; Integer[] b = {0x56, 0x78}; int i = ArrayUtil.indexOfSub(a, b); @@ -409,17 +409,17 @@ public class ArrayUtilTest { } @Test - public void reverseTest(){ - int[] a = {1,2,3,4}; + public void reverseTest() { + int[] a = {1, 2, 3, 4}; final int[] reverse = ArrayUtil.reverse(a); - Assert.assertArrayEquals(new int[]{4,3,2,1}, reverse); + Assert.assertArrayEquals(new int[]{4, 3, 2, 1}, reverse); } @Test - public void reverseTest2s(){ - Object[] a = {"1",'2',"3",4}; + public void reverseTest2s() { + Object[] a = {"1", '2', "3", 4}; final Object[] reverse = ArrayUtil.reverse(a); - Assert.assertArrayEquals(new Object[]{4,"3",'2',"1"}, reverse); + Assert.assertArrayEquals(new Object[]{4, "3", '2', "1"}, reverse); } @Test @@ -461,9 +461,63 @@ public class ArrayUtilTest { } @Test - public void getTest(){ + public void getTest() { String[] a = {"a", "b", "c"}; final Object o = ArrayUtil.get(a, -1); Assert.assertEquals("c", o); } + + @Test + public void replaceTest() { + String[] a = {"1", "2", "3", "4"}; + String[] b = {"a", "b", "c"}; + + // 在小于0的位置,-1位置插入,返回b+a + String[] result = ArrayUtil.replace(a, -1, b); + Assert.assertArrayEquals(new String[]{"a", "b", "c", "1", "2", "3", "4"}, result); + + // 在第0个位置插入,即覆盖a,直接返回b + result = ArrayUtil.replace(a, 0, b); + Assert.assertArrayEquals(new String[]{"a", "b", "c"}, result); + + // 在第1个位置插入,即"2"之前 + result = ArrayUtil.replace(a, 1, b); + Assert.assertArrayEquals(new String[]{"1", "a", "b", "c"}, result); + + //上一步测试修改了原数组结构 + String[] c = {"1", "2", "3", "4"}; + String[] d = {"a", "b", "c"}; + + // 在第2个位置插入,即"3"之后 + result = ArrayUtil.replace(c, 2, d); + Assert.assertArrayEquals(new String[]{"1", "2", "a", "b", "c"}, result); + + // 在第3个位置插入,即"4"之后 + result = ArrayUtil.replace(c, 3, d); + Assert.assertArrayEquals(new String[]{"1", "2", "3", "a", "b", "c"}, result); + + // 在第4个位置插入,数组长度为4,在索引4出替换即两个数组相加 + result = ArrayUtil.replace(c, 4, d); + Assert.assertArrayEquals(new String[]{"1", "2", "3", "4", "a", "b", "c"}, result); + + // 在大于3个位置插入,数组长度为4,即两个数组相加 + result = ArrayUtil.replace(c, 5, d); + Assert.assertArrayEquals(new String[]{"1", "2", "3", "4", "a", "b", "c"}, result); + + //上一步测试修改了原数组结构 + String[] e = null; + String[] f = {"a", "b", "c"}; + + // e为null 返回 f + result = ArrayUtil.replace(e, -1, f); + Assert.assertArrayEquals(new String[]{"a", "b", "c"}, result); + + //上一步测试修改了原数组结构 + String[] g = {"a", "b", "c"}; + String[] h = null; + + // h为null 返回 g + result = ArrayUtil.replace(g, 0, h); + Assert.assertArrayEquals(new String[]{"a", "b", "c"}, result); + } } From 7acac417e694287870ea6eda36339c0e4fa3f094 Mon Sep 17 00:00:00 2001 From: Husky <2466896229@qq.com> Date: Sun, 13 Mar 2022 23:08:40 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/test/java/cn/hutool/core/util/ArrayUtilTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java index e2ce30b9e..442ce4b91 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java @@ -504,7 +504,6 @@ public class ArrayUtilTest { result = ArrayUtil.replace(c, 5, d); Assert.assertArrayEquals(new String[]{"1", "2", "3", "4", "a", "b", "c"}, result); - //上一步测试修改了原数组结构 String[] e = null; String[] f = {"a", "b", "c"}; @@ -512,7 +511,6 @@ public class ArrayUtilTest { result = ArrayUtil.replace(e, -1, f); Assert.assertArrayEquals(new String[]{"a", "b", "c"}, result); - //上一步测试修改了原数组结构 String[] g = {"a", "b", "c"}; String[] h = null;