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 0590a76e8..fe4d3160a 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
@@ -29,10 +29,19 @@ public class ReflectUtil {
}
/**
- * 获取描述符
+ * 获取jvm定义的Field Descriptors(字段描述)
*
* @param executable 可执行的反射对象
* @return 描述符
+ * @apiNote 参考:jvm定义的Field Descriptors(字段描述)
+ *
例:
+ *
+ * - {@code ReflectUtil.getDescriptor(Object.class.getMethod("hashCode")) // "()I"}
+ * - {@code ReflectUtil.getDescriptor(Object.class.getMethod("toString")) // "()Ljava/lang/String;"}
+ * - {@code ReflectUtil.getDescriptor(Object.class.getMethod("equals", Object.class)) // "(Ljava/lang/Object;)Z"}
+ * - {@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"}
+ *
Object.class.getMethod("hashCode")
*/
public static String getDescriptor(Executable executable) {
StringBuilder stringBuilder = new StringBuilder();
@@ -52,6 +61,13 @@ public class ReflectUtil {
throw new IllegalArgumentException("Unknown Executable: " + executable);
}
+ /**
+ * 拼接描述符
+ *
+ * @param clazz 类
+ * @param stringBuilder 描述符
+ * @link jvm定义的Field Descriptors(字段描述)
+ */
private static void appendDescriptor(Class> clazz, StringBuilder stringBuilder) {
Class> currentClass;
for (currentClass = clazz;
@@ -59,7 +75,7 @@ public class ReflectUtil {
currentClass = currentClass.getComponentType()) {
stringBuilder.append('[');
}
- if (currentClass.isPrimitive()) {
+ if (ClassUtil.isBasicType(currentClass)) {
stringBuilder.append(getDescriptorChar(currentClass));
} else {
stringBuilder.append('L').append(currentClass.getName().replace('.', '/')).append(';');
@@ -67,9 +83,13 @@ public class ReflectUtil {
}
+ /**
+ * 获取单个描述符
+ *
+ * @param currentClass 当前类
+ * @return 描述符
+ */
private static char getDescriptorChar(Class> currentClass) {
- // see sun.invoke.util.Wrapper
- // These must be in the order defined for widening primitive conversions in JLS 5.1.2
if (currentClass == Boolean.class || currentClass == boolean.class) {
return 'Z';
}
diff --git a/hutool-core/src/test/java/cn/hutool/core/reflect/ReflectUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/reflect/ReflectUtilTest.java
index 0edbc4f85..a89659531 100644
--- a/hutool-core/src/test/java/cn/hutool/core/reflect/ReflectUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/reflect/ReflectUtilTest.java
@@ -1,6 +1,10 @@
package cn.hutool.core.reflect;
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.ArrayUtil;
import lombok.Data;
+import lombok.SneakyThrows;
+import org.junit.Test;
/**
* 反射工具类单元测试
@@ -105,4 +109,14 @@ public class ReflectUtilTest {
}
}
+
+ @Test
+ @SneakyThrows
+ public void testGetDescriptor() {
+ Assert.equals("()I", ReflectUtil.getDescriptor(Object.class.getMethod("hashCode")));
+ Assert.equals("()Ljava/lang/String;", ReflectUtil.getDescriptor(Object.class.getMethod("toString")));
+ Assert.equals("(Ljava/lang/Object;)Z", ReflectUtil.getDescriptor(Object.class.getMethod("equals", Object.class)));
+ Assert.equals("(Ljava/lang/Class;Ljava/lang/StringBuilder;)V", ReflectUtil.getDescriptor(ReflectUtil.class.getDeclaredMethod("appendDescriptor", Class.class, StringBuilder.class)));
+ Assert.equals("([Ljava/lang/Object;)Z", ReflectUtil.getDescriptor(ArrayUtil.class.getMethod("isEmpty", Object[].class)));
+ }
}