天天看点

Java反射七 泛型

Java反射七 泛型

有如下带泛型的类

public class MyObjectWithGenerics {
    /**
     * 泛型成员变量
     */
    public List<String> stringList;

    /**
     * 泛型方法返回值
     *
     * @return
     */
    public List<String> getStringList() {
        return stringList;
    }

    /**
     * 泛型方法参数
     *
     * @param stringList
     */
    public void setStringList(List<String> stringList) {
        this.stringList = stringList;
    }
}
           

获取泛型信息

Class<MyObjectWithGenerics> myObjectWithGenericsClass = MyObjectWithGenerics.class;

// 泛型方法返回类型
Method method = myObjectWithGenericsClass.getMethod("getStringList");

Type genericReturnType = method.getGenericReturnType();

if (genericReturnType instanceof ParameterizedType) {
    ParameterizedType type = (ParameterizedType) genericReturnType;
    Type[] actualTypeArguments = type.getActualTypeArguments();
    for (Type typeArgument : actualTypeArguments) {
        Class typeArgClass = (Class) typeArgument;
        System.out.println("泛型方法返回类型 = " + typeArgClass);
    }
}

// 泛型方法参数类型
method = myObjectWithGenericsClass.getMethod("setStringList", List.class);

Type[] genericParameterTypes = method.getGenericParameterTypes();

for (Type genericParameterType : genericParameterTypes) {
    if (genericParameterType instanceof ParameterizedType) {
        ParameterizedType aType = (ParameterizedType) genericParameterType;
        Type[] parameterArgTypes = aType.getActualTypeArguments();
        for (Type parameterArgType : parameterArgTypes) {
            Class parameterArgClass = (Class) parameterArgType;
            System.out.println("泛型方法参数类型 = " + parameterArgClass);
        }
    }
}

// 泛型成员变量类型
Field field = myObjectWithGenericsClass.getField("stringList");

Type genericFieldType = field.getGenericType();

if (genericFieldType instanceof ParameterizedType) {
    ParameterizedType aType = (ParameterizedType) genericFieldType;
    Type[] fieldArgTypes = aType.getActualTypeArguments();
    for (Type fieldArgType : fieldArgTypes) {
        Class fieldArgClass = (Class) fieldArgType;
        System.out.println("泛型变量类型 = " + fieldArgClass);
    }
}
           

结果如下

泛型方法返回类型 = class java.lang.String
泛型方法参数类型 = class java.lang.String
泛型变量类型 = class java.lang.String
           

源码地址

点我

更多

微信公众号:卖字母维生(living-coding),更多教程、工具、资源分享