java反射 - 获取泛型的class
基本代码原理
获取泛型,主要就是看 Type 是不是继承自 ParameterizedType,核心代码如下。
class Test{
public Type[] eg(Type type){
if (type instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) type;
return parameterizedType.getActualTypeArguments();
}
return null;
}
}
工具类
package cn.seaboot.commons.reflect;
import cn.seaboot.commons.core.CommonUtils;
import cn.seaboot.commons.lang.Warning;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.*;
import java.util.*;
/**
* 主要用于对象解析
*
* @author Mr.css
* @version 2019/8/22 17:15
*/
public class ObjectUtils {
/**
* 获取参数的泛型
*
* @param parameter 参数
* @return Type
*/
public static Type[] getGeneric(Parameter parameter) {
Type type = parameter.getParameterizedType();
if (type instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) type;
return parameterizedType.getActualTypeArguments();
}
return null;
}
/**
* 获取参数的泛型
*
* @param parameter 参数
* @return Type
*/
public static Type getFirstGeneric(Parameter parameter) {
return getFirstGeneric(getGeneric(parameter));
}
/**
* 获取字段的泛型
*
* @param field 对象字段
* @return Type
*/
public static Type[] getGeneric(Field field) {
Type type = field.getGenericType();
if (type instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) type;
return parameterizedType.getActualTypeArguments();
}
return null;
}
/**
* 获取字段的泛型
*
* @param field 对象字段
* @return Type
*/
public static Type getFirstGeneric(Field field) {
return getFirstGeneric(getGeneric(field));
}
/**
* 获取某个接口的泛型,
* 例如:A类继承自List,List用到的泛型数Integer,业务中需要获取List采用的泛型。
* 此时:instance填A.class, targetClass填写List.class
*
* @param instance 对象实例/接口
* @param targetClass 目标接口,因为Java允许多继承,需要声明,要获取哪个接口的泛型
* @return Type
*/
public static Type[] getGeneric(Class<?> instance, Class<?> targetClass) {
Type[] superclass = instance.getGenericInterfaces();
for (Type type : superclass) {
if (type instanceof ParameterizedType) {
ParameterizedType parameterized = (ParameterizedType) type;
if (parameterized.getRawType().equals(targetClass)) {
return parameterized.getActualTypeArguments();
}
}
}
return null;
}
/**
* 获取某个接口的泛型,
* 例如:A类继承自List,List用到的泛型数Integer,业务中需要获取List采用的泛型。
* 此时:instance填A.class, targetClass填写List.class
*
* @param instance 对象实例/接口
* @param targetClass 目标接口,因为Java允许多继承,需要声明,要获取哪个接口的泛型
* @return Type
*/
public static Type getFirstGeneric(Class<?> instance, Class<?> targetClass) {
return getFirstGeneric(getGeneric(instance, targetClass));
}
/**
* 获取返回值泛型
*
* @param method -
* @return type[]
*/
public static Type[] getReturnGeneric(Method method) {
Type type = method.getGenericReturnType();
if (type instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) type;
return parameterizedType.getActualTypeArguments();
}
return null;
}
/**
* 获取返回值泛型
*
* @param method -
* @return type[]
*/
public static Type getFirstReturnGeneric(Method method) {
return getFirstGeneric(getReturnGeneric(method));
}
/**
* 多数场合下,并不需要返回全部的泛型类型,
* 在明确只有1个泛型的情况下,数组会增加非常多的空值判断
*
* @return 第一个泛型
*/
public static Type getFirstGeneric(Type[] types) {
if (CommonUtils.isNotEmpty(types)) {
return types[0];
} else {
return null;
}
}
}
疯狂的妞妞 :每一天,做什么都好,不要什么都不做!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY