Java泛型在编译阶段会进行泛型擦除,所以能够在运行期获得的泛型是在编译阶段已经确定(继承的泛型类)了的。
1 public class GenricUtils { 2 /** 3 * 获得泛型类型 4 * @param clz 5 * @return 6 */ 7 public static <T> Class<T> getGenricClassType(Class clz){ 8 Type type = clz.getGenericSuperclass(); 9 if(type instanceof ParameterizedType){ 10 ParameterizedType pt = (ParameterizedType) type; 11 Type[] types = pt.getActualTypeArguments(); 12 if(types.length > 0 && types[0] instanceof Class){ 13 return (Class) types[0]; 14 } 15 } 16 return (Class) Object.class; 17 } 18 }
比如:
1 class TestA<T>{ 2 private Class<T> clz = GenricUtils.getGenricClassType(TestA.class); 3 public void get(String id){ 4 session.get(clz,id); 5 } 6 } 7 class TestB extends TestA<String>{ 8 }
在执行:
System.out.println(getGenricClassType(TestA.class)); System.out.println(getGenricClassType(TestB.class));
输出的结果分别为:
class java.lang.Object class java.lang.String
时间: 2024-12-28 01:53:09