Java反射中如何获取到当前类的泛型的类型,而且泛型包含多个类类型
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Java反射中,直接获取到当前类声明的泛型类型参数是有限制的,因为泛型类型信息在编译时会经历类型擦除,导致运行时无法直接获取具体的泛型参数类型。但是,如果需要在运行时获取包含在类定义中的泛型参数类型,有以下几种方法可以尝试:
通过子类或方法的泛型参数: 如果你需要获取的是某个类实例的泛型类型,并且这个类是通过继承或者实现接口的方式指定了泛型类型,那么可以通过该类的子类或者其某个方法(该方法也使用了相同的泛型类型)来间接获取。这是因为子类或具体方法的签名在编译时生成了类型信息,这部分信息在运行时是可访问的。
public class Parent<T> {
// ...
}
public class Child extends Parent<String> {
// ...
}
// 获取Child类的父类泛型参数
ParameterizedType type = (ParameterizedType) Child.class.getGenericSuperclass();
Type[] actualTypeArguments = type.getActualTypeArguments();
System.out.println(actualTypeArguments[0]); // 输出:class java.lang.String
利用@SuppressWarnings("rawtypes")"
和强制类型转换: 对于某些特定场景,如分析已知结构的集合等,可以通过遍历类的字段或方法返回类型,并对泛型化的集合进行特殊处理来尝试获取泛型参数类型。但请注意,这种方法并不通用,且存在类型安全警告。
保存泛型类型信息: 在设计类时,可以在类中提供一个静态方法或成员变量来保存泛型类型信息,这样在运行时就可以直接访问这些信息了。
public class MyClass<T> {
private static final Class<T> TYPE;
public MyClass() {
TYPE = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
public static Class<T> getGenericType() {
return TYPE;
}
}
针对您的问题,如果想要获取到一个类定义中包含多个泛型类型的参数,上述第一种方法(通过子类或方法的泛型参数)最为适用。当类定义中有多重泛型参数时,getActualTypeArguments()
会返回一个Type[]
数组,数组中的每个元素对应一个泛型参数的实际类型。例如,对于类MyClass<T, U>
,你可以通过类似方式获取T
和U
的具体类型。