Java获取泛型真实类型的方法
1、获取父类泛型类的泛型
public abstract class AbstractDao<T> { public Class<T> getActualType() { ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass(); return (Class<T>) parameterizedType.getActualTypeArguments()[0]; } } public class UserDao extends AbstractDao<String> { public static void main(String[] args) { UserDao userDao = new UserDao(); Class<String> actualType = userDao.getActualType(); System.out.println(actualType.getName()); } }
2、获取成员变量的泛型
public class User { private List<String> list; public static void main(String[] args) { try { Field field = User.class.getDeclaredField("list"); Type genericType = field.getGenericType(); if (genericType != null && genericType instanceof ParameterizedType) { Type actualType = ((ParameterizedType) genericType).getActualTypeArguments()[0]; System.out.println(actualType.getTypeName()); } } catch (Exception e) { } } }
3、获取局部变量的泛型,注意:泛型必须以匿名内部类的方式
public abstract class AbstractDao<T> { public Class<T> getActualType() { ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass(); return (Class<T>) parameterizedType.getActualTypeArguments()[0]; } public static void main(String[] args) { AbstractDao<String> dao = new AbstractDao<String>() { }; System.out.println(dao.getActualType().getTypeName()); } }
4、通过接口/父类的匿名内部类作为参数传递到方法
在方法中可以获得匿名内部类继承的父类或实现的接口的泛型的真实类型
AbstractDao如参考例子一,是一个带泛型的抽象类
打印如下:
总结一下
如果是继承基类而来的泛型,就用 getGenericSuperclass() , 转型为 ParameterizedType 来获得实际类型
如果是实现接口而来的泛型,就用 getGenericInterfaces() , 针对其中的元素转型为 ParameterizedType 来获得实际类型
我们所说的 Java 泛型在字节码中会被擦除,并不总是擦除为 Object 类型,而是擦除到上限类型
能否获得想要的类型可以在 IDE 中,或用 javap -v <your_class> 来查看泛型签名来找到线索
转载:https://blog.csdn.net/qq_30038111/article/details/100611523
https://blog.csdn.net/hj7jay/article/details/54889717
带着疑问去思考,然后串联,进而归纳总结,不断追问自己,进行自我辩证,像侦查嫌疑案件一样看待技术问题,漆黑的街道,你我一起寻找线索,你就是技术界大侦探福尔摩斯