使用反射在 Java 中获取泛型参数类型
在 Java 中,泛型类型是一个强大的功能,它允许更灵活和可重用的代码。然而,使用通用参数有时可能会很棘手。一个常见的挑战是在运行时确定泛型参数的实际类型。
可能吗?
是的,可以获取泛型参数的类型使用反射。反射提供了一种在运行时访问和操作有关 Java 类的结构、字段和方法的详细信息的方法。
示例:
考虑以下代码片段:
public class Voodoo { public static void chill(List<?> aListWithTypeSpiderMan) { // Here I'd like to get the Class-Object 'SpiderMan' Class typeOfTheList = ???; } public static void main(String... args) { chill(new ArrayList<SpiderMan>()); } }
在 chill 方法中,我们有一个未知类型的列表。我们想要确定实际的类型参数,在本例中应该是 SpiderMan。
解决方案:
解决方案涉及使用 ParameterizedType 接口,它是一种类型描述参数化类型的类型,例如使用泛型的类型。下面是我们如何实现它:
Class typeOfTheList = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
这段代码获取当前类的超类(在本例中为 Voodoo),它应该是一个参数化类型,然后提取实际的类型参数。第一个类型参数对应于我们感兴趣的类型参数,即 SpiderMan。
注意:
Java 16 之前不完全支持此技术。早期对泛型类型使用反射被认为是 hacky,但从 Java 16 开始,getActualTypeArguments() 已添加到 Type 接口中,提供了一种更干净、更简化的方式访问通用类型信息。
以上是如何使用反射获取 Java 中的泛型参数类型?的详细内容。更多信息请关注PHP中文网其他相关文章!