Java获取父类泛型类型

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

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

public class Person {
}

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

public class Student extends Person {
}

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);
    }

}

Java获取父类泛型类型_第1张图片

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());
    }

}

Java获取父类泛型类型_第2张图片

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

public class GenericClass {
    private Person persons;
    private List listString;
    private Map maps;
    private List> 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());
    }
}

你可能感兴趣的:(Spring,Boot,源码)