Java获取父类泛型类型

为什么要获取父类的泛型类型?

在我们看Spring源码时,通过判断父类的泛型类型,监听器是哪种监听类型,通过以下方式可以获取到监听的类型
创建一个Person的父类,泛型类型为String,用于子类继承
package com.zk.demo.test;

public class Person<T> {
}

创建一个子类用于继承父类
package com.zk.demo.test;

public class Student extends Person<String> {
}

1.使用Java原声的方式获取

package com.zk.demo.test;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class TestMain {

    public static void main(String[] args) {
        // 获取继承父类的泛型类型
        ParameterizedType parameterizedType = (ParameterizedType)Student.class.getGenericSuperclass();
        System.out.println(parameterizedType);
        Type type = parameterizedType.getActualTypeArguments()[0];
        System.out.println(type);
    }

}

在这里插入图片描述

2.使用Spring提供的ResolvableType类进行获取

package com.zk.demo.test;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class TestMain {

    public static void main(String[] args) {
        // 获取继承父类的泛型类型
        ResolvableType resolvableType = ResolvableType.forClass(Student.class);
        System.out.println(resolvableType);
        System.out.println(resolvableType.getSuperType());
        System.out.println(resolvableType.getSuperType().getGeneric(0).resolve());
    }

}

在这里插入图片描述

使用ResolvableType类得到字段级别的信息

public class GenericClass {
    private Person<String> persons;
    private List<String> listString;
    private Map<String, Long> maps;
    private List<List<String>> listlist;
}
测试类
获取字段对象中泛型
public class Test2Main {
    public static void main(String[] args) {
        Field field = ReflectionUtils.findField(GenericClass.class, "persons");
        ResolvableType resolvableType = ResolvableType.forField(field);
        System.out.println(resolvableType);
        System.out.println(resolvableType.getGeneric(0).resolve());
    }
}
获取list中的泛型
public class Test2Main {
    public static void main(String[] args) {
        Field field = ReflectionUtils.findField(GenericClass.class, "listString");
        ResolvableType resolvableType = ResolvableType.forField(field);
        System.out.println(resolvableType);
        System.out.println(resolvableType.getGeneric(0, 0).resolve());
    }
}
获取map中的泛型
public class Test2Main {
    public static void main(String[] args) {
        Field field = ReflectionUtils.findField(GenericClass.class, "maps");
        ResolvableType resolvableType = ResolvableType.forField(field);
        System.out.println(resolvableType);
        System.out.println(resolvableType.getGeneric(0).resolve());
        System.out.println(resolvableType.getGeneric(1).resolve());
    }
}
获取list中放list
public class Test2Main {
    public static void main(String[] args) {
       Field field = ReflectionUtils.findField(GenericClass.class, "listlist");
        ResolvableType resolvableType = ResolvableType.forField(field);
        System.out.println(resolvableType);
        System.out.println(resolvableType.getGeneric(0).getGeneric(0).resolve());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值