项目中使用一个工具类,需要传入类的class来确定返回的结果类型,比如:
public <T> convert(Object obj,Class<T> t){
.......
}
类似这种格式
然后我想传入一个类型比如:List<String>的class,但是不能直接写List<String>.class,如果需要获取泛型的class那么定义一个工具来解决。
具体思路是通过反射来获取类上边定义的泛型信息,为了使整个工具通用,设计一个抽象类并且声明泛型,由子类来传入泛型类型,再通过反射获取。
完整的工具类
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public abstract class TypeReference<T> {
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<String> typeReference = new TypeReference<String>() {
匿名内部类
};
typeReference.getType(); // 获取泛型class类型
在构造器中通过反射来拿到泛型的类型
protected TypeReference() {
// 拿到当前的匿名类的class对象
Class<?> parameterizedTypeReferenceSubclass = findParameterizedTypeReferenceSubclass(this.getClass());
// 再获取匿名类的父类,也就是TypeReference的类型信息
Type type = parameterizedTypeReferenceSubclass.getGenericSuperclass();
ParameterizedType parameterizedType = (ParameterizedType)type;
// 再去取得当前的泛型类型,比如 TypeReference<String> tf = new TypeReference();
// 获取的就是String的类型信息
this.type = parameterizedType.getActualTypeArguments()[0];
}