获取泛型的元素(20.6.3)

基本使用

public class FetchGenericItem {
    private Collection<String> names;

    public static void main(String[] args) throws Exception {
        FetchGenericItem fetchGenericItem = new FetchGenericItem();
        //场景1:获取成员变量的泛型元素
        Field field = fetchGenericItem.getClass().getDeclaredField("names");
        System.out.println(fetchGenericItem.getActualTypeFieldType(field.getGenericType()));//class java.lang.String

        //场景2:获取方法参数的泛型元素
        Method method = fetchGenericItem.getClass().getDeclaredMethod("setNames", Collection.class);
        Type[] genericParameterTypes = method.getGenericParameterTypes();
        for (Type genericParameterType : genericParameterTypes) {
            System.out.println(fetchGenericItem.getActualTypeFieldType(genericParameterType));//class java.lang.String
        }
    }

    public FetchGenericItem setNames(Collection<String> names) {
        this.names = names;
        return this;
    }

    /**
     * 获取泛型类型
     */
    private Type getActualTypeFieldType(Type elType) {

        if (elType instanceof ParameterizedType) {
            ParameterizedType parameterizedType = (ParameterizedType) elType;
            Type[] types = parameterizedType.getActualTypeArguments();
            if (types.length == 1)
                return parameterizedType.getActualTypeArguments()[0];
            else
                return null;
        } else
            return null;
    }
}

Type

type类型是所有类型的父类


image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。