Java中如何获取Field字段对应的完整泛型类型信息
实现方案
Java泛型会在编译期执行类型擦除,直接调用Field.getType()只能拿到擦除后的原始类型List,要获取完整的参数化类型信息,需要使用Field.getGenericType()方法处理:
import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.List; class X { private String y; } class T { private List<X> w; private void run() throws NoSuchFieldException { Field f = getClass().getDeclaredField("w"); Type fieldGenericType = f.getGenericType(); if (fieldGenericType instanceof ParameterizedType pt) { // 获取完整的泛型类型描述,输出为java.util.List<X的全限定名> String fullTypeName = pt.getTypeName(); System.out.println(fullTypeName); // 如果要单独拿泛型参数X的Class对象 Class<?> genericArgClass = (Class<?>) pt.getActualTypeArguments()[0]; System.out.println(genericArgClass.getName()); } } public static void main(String[] args) throws NoSuchFieldException { new T().run(); } }
说明
getAnnotatedType是用来获取类型上挂载的注解信息的,和泛型参数提取无关,所以无法满足你的需求- 上述方案仅适用于字段泛型参数在编译期固定写死的场景,如果是类级别的泛型参数(比如
class T<V> { private List<V> w; }),需要额外递归解析父类的泛型签名才能拿到实际的参数类型
内容的提问来源于stack exchange,提问作者http8086
相关产品推荐
相关产品推荐

