From 8206176db9b4f79e025f4ed499cc8121bde05088 Mon Sep 17 00:00:00 2001 From: Zjp <1215582715@qq.com> Date: Fri, 23 Sep 2022 09:36:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=80=E4=BA=9B=E5=B0=8F=E4=BF=AE=E8=A1=A5:?= =?UTF-8?q?=201.=E4=BC=98=E5=8C=96LambdaUtil=E5=A4=9A=E4=BD=99=E8=AF=AD?= =?UTF-8?q?=E5=8F=A5,=20=E4=BC=98=E5=8C=96=E7=BC=93=E5=AD=98=E7=9A=84key?= =?UTF-8?q?=E5=80=BC;=202.=E4=BF=AE=E6=AD=A3ReflectUtil=E7=9A=84javadoc?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E6=98=BE=E7=A4=BA,=20=E4=BC=98=E5=8C=96Strin?= =?UTF-8?q?gBuilder=E5=88=9D=E5=A7=8B=E5=8C=96=E9=95=BF=E5=BA=A6;=203.?= =?UTF-8?q?=E4=BC=98=E5=8C=96CharSequenceUtil=E7=9A=84replace=E6=96=B9?= =?UTF-8?q?=E6=B3=95,=20=E4=BC=98=E5=8C=96StringBuilder=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E9=95=BF=E5=BA=A6,=20=E4=BC=98=E5=8C=96=E5=AF=B9codeP?= =?UTF-8?q?oint=E7=9A=84=E6=B7=BB=E5=8A=A0=E5=A4=84=E7=90=86;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/core/lang/func/LambdaUtil.java | 15 +++------- .../cn/hutool/core/reflect/ReflectUtil.java | 28 +++++++++---------- .../cn/hutool/core/text/CharSequenceUtil.java | 11 ++++---- .../core/text/CharSequenceUtilTest.java | 3 ++ .../java/cn/hutool/core/text/StrUtilTest.java | 6 ++++ 5 files changed, 33 insertions(+), 30 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaUtil.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaUtil.java index 4bfa0521a..4790332b1 100755 --- a/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaUtil.java @@ -13,7 +13,6 @@ import java.lang.invoke.SerializedLambda; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.lang.reflect.Proxy; -import java.util.Objects; /** * Lambda相关工具类 @@ -23,7 +22,7 @@ import java.util.Objects; */ public class LambdaUtil { - private static final WeakConcurrentMap CACHE = new WeakConcurrentMap<>(); + private static final WeakConcurrentMap CACHE = new WeakConcurrentMap<>(); /** * 通过对象的方法或类的静态方法引用,获取lambda实现类 @@ -73,16 +72,10 @@ public class LambdaUtil { * @return 返回解析后的结果 */ public static LambdaInfo resolve(final T func) { - return CACHE.computeIfAbsent(func.getClass().getName(), (key) -> { + return CACHE.computeIfAbsent(func, (key) -> { final SerializedLambda serializedLambda = _resolve(func); final String methodName = serializedLambda.getImplMethodName(); - final Class implClass; - ClassLoaderUtil.loadClass(serializedLambda.getImplClass().replace("/", "."), true); - try { - implClass = Class.forName(serializedLambda.getImplClass().replace("/", "."), true, Thread.currentThread().getContextClassLoader()); - } catch (final ClassNotFoundException e) { - throw new UtilException(e); - } + final Class implClass = ClassLoaderUtil.loadClass(serializedLambda.getImplClass(), true); if ("".equals(methodName)) { for (final Constructor constructor : implClass.getDeclaredConstructors()) { if (ReflectUtil.getDescriptor(constructor).equals(serializedLambda.getImplMethodSignature())) { @@ -160,7 +153,7 @@ public class LambdaUtil { throw new IllegalArgumentException("Not a lambda expression: " + clazz.getName()); } final Object serLambda = MethodUtil.invoke(func, "writeReplace"); - if (Objects.nonNull(serLambda) && serLambda instanceof SerializedLambda) { + if (serLambda instanceof SerializedLambda) { return (SerializedLambda) serLambda; } throw new UtilException("writeReplace result value is not java.lang.invoke.SerializedLambda"); diff --git a/hutool-core/src/main/java/cn/hutool/core/reflect/ReflectUtil.java b/hutool-core/src/main/java/cn/hutool/core/reflect/ReflectUtil.java index 66096417a..727f5a31a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/reflect/ReflectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/reflect/ReflectUtil.java @@ -30,12 +30,6 @@ public class ReflectUtil { /** * 获取jvm定义的Field Descriptors(字段描述) - * - * @param executable 可执行的反射对象 - * @return 描述符 - * @author VampireAchao - * @see jvm定义的Field Descriptors(字段描述) - * @see 关于类型描述符的博客 *

例:

*
    *
  • {@code ReflectUtil.getDescriptor(Object.class.getMethod("hashCode")) // "()I"}
  • @@ -44,9 +38,15 @@ public class ReflectUtil { *
  • {@code ReflectUtil.getDescriptor(ReflectUtil.class.getDeclaredMethod("appendDescriptor", Class.clas, StringBuilder.class)) // "(Ljava/lang/Class;Ljava/lang/StringBuilder;)V"}
  • *
  • {@code ReflectUtil.getDescriptor(ArrayUtil.class.getMethod("isEmpty", Object[].class)) // "([Ljava/lang/Object;)Z"}
  • *
+ * + * @param executable 可执行的反射对象 + * @return 描述符 + * @author VampireAchao + * @see jvm定义的Field Descriptors(字段描述) + * @see 关于类型描述符的博客 */ public static String getDescriptor(final Executable executable) { - final StringBuilder stringBuilder = new StringBuilder(); + final StringBuilder stringBuilder = new StringBuilder(32); stringBuilder.append('('); final Class[] parameters = executable.getParameterTypes(); for (final Class parameter : parameters) { @@ -63,12 +63,6 @@ public class ReflectUtil { /** * 获取类型描述符,这是编译成class文件后的二进制名称 - * - * @param clazz 类 - * @return 描述字符串 - * @author VampireAchao - * @see jvm定义的Field Descriptors(字段描述) - * @see 关于类型描述符的博客 *

例:

*
    *
  • {@code ReflectUtil.getDescriptor(boolean.class) "Z"}
  • @@ -77,9 +71,15 @@ public class ReflectUtil { *
  • {@code ReflectUtil.getDescriptor(int.class) "I"}
  • *
  • {@code ReflectUtil.getDescriptor(Integer.class) "Ljava/lang/Integer;"}
  • *
+ * + * @param clazz 类 + * @return 描述字符串 + * @author VampireAchao + * @see jvm定义的Field Descriptors(字段描述) + * @see 关于类型描述符的博客 */ public static String getDescriptor(final Class clazz) { - final StringBuilder stringBuilder = new StringBuilder(); + final StringBuilder stringBuilder = new StringBuilder(32); Class currentClass; for (currentClass = clazz; currentClass.isArray(); diff --git a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java index 373adc478..da258545e 100755 --- a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java @@ -3366,12 +3366,12 @@ public class CharSequenceUtil extends StrChecker { return originalStr; } - final StringBuilder stringBuilder = new StringBuilder(); + final StringBuilder stringBuilder = new StringBuilder(originalStr.length()); for (int i = 0; i < strLength; i++) { if (i >= startInclude && i < endExclude) { stringBuilder.append(replacedChar); } else { - stringBuilder.append(new String(strCodePoints, i, 1)); + stringBuilder.appendCodePoint(strCodePoints[i]); } } return stringBuilder.toString(); @@ -3406,13 +3406,14 @@ public class CharSequenceUtil extends StrChecker { return originalStr; } - final StringBuilder stringBuilder = new StringBuilder(); + // 新字符串长度 <= 旧长度 - (被替换区间codePoints数量) + 替换字符串长度 + final StringBuilder stringBuilder = new StringBuilder(originalStr.length() - (endExclude - startInclude) + replacedStr.length()); for (int i = 0; i < startInclude; i++) { - stringBuilder.append(new String(strCodePoints, i, 1)); + stringBuilder.appendCodePoint(strCodePoints[i]); } stringBuilder.append(replacedStr); for (int i = endExclude; i < strLength; i++) { - stringBuilder.append(new String(strCodePoints, i, 1)); + stringBuilder.appendCodePoint(strCodePoints[i]); } return stringBuilder.toString(); } diff --git a/hutool-core/src/test/java/cn/hutool/core/text/CharSequenceUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/text/CharSequenceUtilTest.java index 3ae6f70a1..969c4ec30 100755 --- a/hutool-core/src/test/java/cn/hutool/core/text/CharSequenceUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/text/CharSequenceUtilTest.java @@ -30,6 +30,9 @@ public class CharSequenceUtilTest { final String replace = "SSM15930297701BeryAllen"; final String result = CharSequenceUtil.replace(replace, 5, 12, "***"); Assert.assertEquals("SSM15***01BeryAllen", result); + + String emoji = StrUtil.replace("\uD83D\uDE00aabb\uD83D\uDE00ccdd", 2, 6, "***"); + Assert.assertEquals("\uD83D\uDE00a***ccdd", emoji); } @Test diff --git a/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java index 95cfe2ebc..3576efbd0 100644 --- a/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java @@ -220,6 +220,9 @@ public class StrUtilTest { Assert.assertEquals("aa****dd", string); string = StrUtil.replace("aabbccdd", 2, 12, '*'); Assert.assertEquals("aa******", string); + + String emoji = StrUtil.replace("\uD83D\uDE00aabb\uD83D\uDE00ccdd", 2, 6, '*'); + Assert.assertEquals("\uD83D\uDE00a****ccdd", emoji); } @Test @@ -627,6 +630,9 @@ public class StrUtilTest { final String replace = "SSM15930297701BeryAllen"; final String result = StrUtil.replace(replace, 5, 12, "***"); Assert.assertEquals("SSM15***01BeryAllen", result); + + String emoji = StrUtil.replace("\uD83D\uDE00aabb\uD83D\uDE00ccdd", 2, 6, "***"); + Assert.assertEquals("\uD83D\uDE00a***ccdd", emoji); } @Test