一些小修补:

1.优化LambdaUtil多余语句, 优化缓存的key值;
2.修正ReflectUtil的javadoc文档显示, 优化StringBuilder初始化长度;
3.优化CharSequenceUtil的replace方法, 优化StringBuilder初始化长度, 优化对codePoint的添加处理;
This commit is contained in:
Zjp 2022-09-23 09:36:44 +08:00
parent b13329d781
commit 8206176db9
5 changed files with 33 additions and 30 deletions

View File

@ -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");

View File

@ -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();

View File

@ -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();
}

View File

@ -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

View File

@ -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