Java获取泛型真实类型的方法
1、获取父类泛型类的泛型
public abstract class AbstractDao{ public Class getActualType() { ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass(); return (Class ) parameterizedType.getActualTypeArguments()[0]; } } public class UserDao extends AbstractDao { public static void main(String[] args) { UserDao userDao = new UserDao(); Class actualType = userDao.getActualType(); System.out.println(actualType.getName()); } }
2、获取成员变量的泛型
public class User { private Listlist; 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{ public Class getActualType() { ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass(); return (Class ) parameterizedType.getActualTypeArguments()[0]; } public static void main(String[] args) { AbstractDao dao = new AbstractDao () { }; System.out.println(dao.getActualType().getTypeName()); } }
4、通过接口/父类的匿名内部类作为参数传递到方法
在方法中可以获得匿名内部类继承的父类或实现的接口的泛型的真实类型
AbstractDao如参考例子一,是一个带泛型的抽象类
打印如下:
总结一下
如果是继承基类而来的泛型,就用 getGenericSuperclass() , 转型为 ParameterizedType 来获得实际类型
如果是实现接口而来的泛型,就用 getGenericInterfaces() , 针对其中的元素转型为 ParameterizedType 来获得实际类型
我们所说的 Java 泛型在字节码中会被擦除,并不总是擦除为 Object 类型,而是擦除到上限类型
能否获得想要的类型可以在 IDE 中,或用 javap -v
转载:https://blog.csdn.net/qq_30038111/article/details/100611523
https://blog.csdn.net/hj7jay/article/details/54889717
TRANSLATE withArabic | Hebrew | Polish |
Bulgarian | Hindi | Portuguese |
Catalan | Hmong Daw | Romanian |
Chinese Simplified | Hungarian | Russian |
Chinese Traditional | Indonesian | Slovak |
Czech | Italian | Slovenian |
Danish | Japanese | Spanish |
Dutch | Klingon | Swedish |
English | Korean | Thai |
Estonian | Latvian | Turkish |
Finnish | Lithuanian | Ukrainian |
French | Malay | Urdu |
German | Maltese | Vietnamese |
Greek | Norwegian | Welsh |
Haitian Creole | Persian |