Java获取泛型的class类型

项目中使用一个工具类,需要传入类的class来确定返回的结果类型,比如:

public  convert(Object obj,Class t){

.......

}

类似这种格式

 然后我想传入一个类型比如:List的class,但是不能直接写List.class,如果需要获取泛型的class那么定义一个工具来解决。

具体思路是通过反射来获取类上边定义的泛型信息,为了使整个工具通用,设计一个抽象类并且声明泛型,由子类来传入泛型类型,再通过反射获取。

完整的工具类

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public abstract class TypeReference {
    private final Type type;

    protected TypeReference() {
        Class parameterizedTypeReferenceSubclass = findParameterizedTypeReferenceSubclass(this.getClass());
        Type type = parameterizedTypeReferenceSubclass.getGenericSuperclass();
        ParameterizedType parameterizedType = (ParameterizedType)type;
        this.type = parameterizedType.getActualTypeArguments()[0];
    }

    public Type getType() {
        return this.type;
    }

    public boolean equals(Object obj) {
        return this == obj || obj instanceof TypeReference && this.type.equals(((TypeReference)obj).type);
    }

    public int hashCode() {
        return this.type.hashCode();
    }

    public String toString() {
        return "TypeReference<" + this.type + ">";
    }

    private static Class findParameterizedTypeReferenceSubclass(Class child) {
        Class parent = child.getSuperclass();
        if (Object.class == parent) {
            throw new IllegalStateException("Expected TypeReference superclass");
        } else {
            return TypeReference.class == parent ? child : findParameterizedTypeReferenceSubclass(parent);
        }
    }

TypeReference是一个抽象类,所以需要子类来继承,一般是直接使用匿名内部类的方式

 TypeReference typeReference = new TypeReference() {
匿名内部类
        };

typeReference.getType(); // 获取泛型class类型

在构造器中通过反射来拿到泛型的类型 

protected TypeReference() {
// 拿到当前的匿名类的class对象
        Class parameterizedTypeReferenceSubclass = findParameterizedTypeReferenceSubclass(this.getClass());
// 再获取匿名类的父类,也就是TypeReference的类型信息
        Type type = parameterizedTypeReferenceSubclass.getGenericSuperclass();
        ParameterizedType parameterizedType = (ParameterizedType)type;
// 再去取得当前的泛型类型,比如 TypeReference tf = new TypeReference();
// 获取的就是String的类型信息
        this.type = parameterizedType.getActualTypeArguments()[0];
    }

你可能感兴趣的:(Java,java,开发语言,后端)