Java反射:如何构造ParameterizedType.getActualTypeArguments()返回空数组的场景
构造方案
你可以通过「参数化外部类的非参数化非静态内部类」实现需求,完整测试代码如下:
import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; // 带泛型的外部类 class Outer<T> { // 无自定义泛型的非静态内部类 class Inner { } } class TestClass { // 字段声明为参数化外部类的内部类类型 public Outer<String>.Inner targetField; } public class Main { public static void main(String[] args) throws NoSuchFieldException { Field field = TestClass.class.getField("targetField"); ParameterizedType type = (ParameterizedType) field.getGenericType(); Type[] actualTypeArguments = type.getActualTypeArguments(); // 此处输出为0,符合你要的空数组返回结果 System.out.println(actualTypeArguments.length); } }
原理解释
文档中描述的「嵌套在参数化类型中的非参数化类型」就是上面例子中的Inner类:
Inner是嵌套在参数化类型Outer<T>中的内部类Inner本身没有定义自己的泛型参数- 当你反射拿到
Outer<String>.Inner对应的ParameterizedType时,getActualTypeArguments()返回的是Inner自身的泛型参数数组,因为它没有自定义泛型所以返回空数组 - 如果需要获取外部类的泛型参数,需要调用
ParameterizedType的getOwnerType()方法拿到外层的参数化类型,再调用其getActualTypeArguments()即可拿到<String>对应的类型信息
注意事项
- 内部类必须是非静态的,如果是静态内部类不会触发该场景
- 内部类不能声明自定义泛型,比如
class Inner<K>这种定义下getActualTypeArguments()会返回Inner自身的泛型参数数组,不会为空
内容的提问来源于stack exchange,提问作者M. Dudek
相关产品推荐
相关产品推荐

