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(字段描述) + *

例:

+ * 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))); + } }