mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-04-19 03:01:48 +08:00
一些小修补:
1.优化LambdaUtil多余语句, 优化缓存的key值; 2.修正ReflectUtil的javadoc文档显示, 优化StringBuilder初始化长度; 3.优化CharSequenceUtil的replace方法, 优化StringBuilder初始化长度, 优化对codePoint的添加处理;
This commit is contained in:
parent
b13329d781
commit
8206176db9
@ -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<String, LambdaInfo> CACHE = new WeakConcurrentMap<>();
|
||||
private static final WeakConcurrentMap<Object, LambdaInfo> CACHE = new WeakConcurrentMap<>();
|
||||
|
||||
/**
|
||||
* 通过对象的方法或类的静态方法引用,获取lambda实现类
|
||||
@ -73,16 +72,10 @@ public class LambdaUtil {
|
||||
* @return 返回解析后的结果
|
||||
*/
|
||||
public static <T extends Serializable> 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 ("<init>".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");
|
||||
|
@ -30,12 +30,6 @@ public class ReflectUtil {
|
||||
|
||||
/**
|
||||
* 获取jvm定义的Field Descriptors(字段描述)
|
||||
*
|
||||
* @param executable 可执行的反射对象
|
||||
* @return 描述符
|
||||
* @author VampireAchao
|
||||
* @see <a href="https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html">jvm定义的Field Descriptors(字段描述)</a>
|
||||
* @see <a href="https://vampireAchao.gitee.io/2022/06/07/%E7%B1%BB%E5%9E%8B%E6%8F%8F%E8%BF%B0%E7%AC%A6/">关于类型描述符的博客</a>
|
||||
* <p>例:</p>
|
||||
* <ul>
|
||||
* <li>{@code ReflectUtil.getDescriptor(Object.class.getMethod("hashCode")) // "()I"}</li>
|
||||
@ -44,9 +38,15 @@ public class ReflectUtil {
|
||||
* <li>{@code ReflectUtil.getDescriptor(ReflectUtil.class.getDeclaredMethod("appendDescriptor", Class.clas, StringBuilder.class)) // "(Ljava/lang/Class;Ljava/lang/StringBuilder;)V"}</li>
|
||||
* <li>{@code ReflectUtil.getDescriptor(ArrayUtil.class.getMethod("isEmpty", Object[].class)) // "([Ljava/lang/Object;)Z"}</li>
|
||||
* </ul>
|
||||
*
|
||||
* @param executable 可执行的反射对象
|
||||
* @return 描述符
|
||||
* @author VampireAchao
|
||||
* @see <a href="https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html">jvm定义的Field Descriptors(字段描述)</a>
|
||||
* @see <a href="https://vampireAchao.gitee.io/2022/06/07/%E7%B1%BB%E5%9E%8B%E6%8F%8F%E8%BF%B0%E7%AC%A6/">关于类型描述符的博客</a>
|
||||
*/
|
||||
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 <a href="https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html">jvm定义的Field Descriptors(字段描述)</a>
|
||||
* @see <a href="https://vampireAchao.gitee.io/2022/06/07/%E7%B1%BB%E5%9E%8B%E6%8F%8F%E8%BF%B0%E7%AC%A6/">关于类型描述符的博客</a>
|
||||
* <p>例:</p>
|
||||
* <ul>
|
||||
* <li>{@code ReflectUtil.getDescriptor(boolean.class) "Z"}</li>
|
||||
@ -77,9 +71,15 @@ public class ReflectUtil {
|
||||
* <li>{@code ReflectUtil.getDescriptor(int.class) "I"}</li>
|
||||
* <li>{@code ReflectUtil.getDescriptor(Integer.class) "Ljava/lang/Integer;"}</li>
|
||||
* </ul>
|
||||
*
|
||||
* @param clazz 类
|
||||
* @return 描述字符串
|
||||
* @author VampireAchao
|
||||
* @see <a href="https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html">jvm定义的Field Descriptors(字段描述)</a>
|
||||
* @see <a href="https://vampireAchao.gitee.io/2022/06/07/%E7%B1%BB%E5%9E%8B%E6%8F%8F%E8%BF%B0%E7%AC%A6/">关于类型描述符的博客</a>
|
||||
*/
|
||||
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();
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user