java获取泛型类型class,java泛型T.class获取

发布于:2025-07-19 ⋅ 阅读:(17) ⋅ 点赞:(0)

代码

import cn.hutool.core.util.ArrayUtil;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;


public class ClassUtils {

    /**
     * 查找泛型类类型。
     * @param klass 类的Class对象
     * @param paramIndex 参数索引,从0开始。
     * @return 泛型类类型,如果未找到则返回null。
     */
    public static Class findParameterizedClass(Class klass, int paramIndex) {
        ParameterizedType parameterizedType = getParameterizedType(klass, 1);
        if (parameterizedType == null) {
            return null;
        }
        //泛型参数类型
        Type[] params = parameterizedType.getActualTypeArguments();
        if (ArrayUtil.isEmpty(params) || params.length <= paramIndex) {
            return null;
        }
        Class clazz = getClazz(params[paramIndex], 1);
        return clazz;
    }

    /**
     * 递归获取 ParameterizedType-泛型类型
     *
     */
    private static ParameterizedType getParameterizedType(Type type, int deep){
        if (deep > 30) {
            throw new IllegalStateException("递归过深,请检查代码");
        }
        //泛型类型
        if(type instanceof ParameterizedType) {
            return (ParameterizedType) type;
        } else if (type instanceof Class) {
            return getParameterizedType((((Class<?>) type).getGenericSuperclass()), deep + 1);
        } else {
            return null;
        }
    }

    /**
     * 递归获取 Class
     */
    private static Class getClazz(Type type, int deep) {
        if (deep > 30) {
            throw new IllegalStateException("递归过深,请检查代码");
        }
        //泛型类型
        if(type instanceof ParameterizedType) {
            Type rawType = ((ParameterizedType) type).getRawType();
            return getClazz(rawType, deep + 1);
        }else{
            return (Class) type;
        }
    }
}

使用效果

获取ExcelTaskServiceImpl第一个和第二个泛型类的class
在这里插入图片描述

测试代码

        Class<ExcelTaskMapper> param1Clazz = ClassUtils.findParameterizedClass(ExcelTaskServiceImpl.class, 0);
        System.out.println(param1Clazz);
        Class<ExcelTask> param2Clazz = ClassUtils.findParameterizedClass(ExcelTaskServiceImpl.class, 1);
        System.out.println(param2Clazz.getName());

效果
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到