From ed27c637b2042304606e8f74e73071ce31e72ec3 Mon Sep 17 00:00:00 2001 From: zwm <2076229520@qq.com> Date: Thu, 20 Nov 2025 23:18:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=A7=A3=E5=86=B3TypeUtil.getClass?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E4=BC=A0=E5=85=A5=E6=B3=9B=E5=9E=8B=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E7=B1=BB=E5=9E=8B=E6=97=B6=E6=96=B9=E6=B3=95=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E9=94=99=E8=AF=AF=E5=80=BCnull=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/util/TypeUtil.java | 6 ++++ .../cn/hutool/core/util/TypeUtilTest.java | 33 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/TypeUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/TypeUtil.java index 4eaedb023..998e734f0 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/TypeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/TypeUtil.java @@ -34,6 +34,12 @@ public class TypeUtil { return (Class) type; } else if (type instanceof ParameterizedType) { return (Class) ((ParameterizedType) type).getRawType(); + } else if (type instanceof GenericArrayType) { + final Type componentType = ((GenericArrayType) type).getGenericComponentType(); + final Class componentClass = getClass(componentType); + if (componentClass != null) { + return Array.newInstance(componentClass, 0).getClass(); + } } else if (type instanceof TypeVariable) { Type[] bounds = ((TypeVariable) type).getBounds(); if (bounds.length == 1) { diff --git a/hutool-core/src/test/java/cn/hutool/core/util/TypeUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/TypeUtilTest.java index 42a7e5665..289d0f224 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/TypeUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/TypeUtilTest.java @@ -1,5 +1,7 @@ package cn.hutool.core.util; +import java.lang.reflect.Array; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.ArrayList; @@ -47,6 +49,37 @@ public class TypeUtilTest { assertEquals(Object.class, clazz); } + /** + * 测试getClass方法对泛型数组类型T[]的处理 + * 验证未绑定泛型参数的数组类型会被正确解析为Object[] + */ + @Test + public void getClassForGenericArrayTypeTest() throws NoSuchFieldException { + // 获取T[]类型字段的泛型类型 + Field levelField = GenericArray.class.getDeclaredField("level"); + Type genericArrayType = levelField.getGenericType(); + // 调用getClass方法处理GenericArrayType + Class clazz = TypeUtil.getClass(genericArrayType); + // 验证返回Object[]类型 + assertNotNull(clazz, "getClass方法返回null"); + assertTrue(clazz.isArray(), "返回类型不是数组"); + assertEquals(Object.class, clazz.getComponentType(), "数组组件类型应为Object"); + } + + /** + * 测试getClass方法对参数化类型数组List[]的处理 + * 验证数组组件类型能正确解析为原始类型 + */ + @Test + public void getClassForParameterizedArrayTypeTest() { + // 创建List[]类型引用 + Type genericArrayType = new TypeReference[]>() {}.getType(); + // 调用getClass方法处理GenericArrayType + Class clazz = TypeUtil.getClass(genericArrayType); + // 验证返回List[]类型 + assertEquals(Array.newInstance(List.class, 0).getClass(), clazz); + } + public static class TestClass { public List getList() { return new ArrayList<>();