开发者社区 问答 正文

Java反射中获取当前类的泛型的类型?

Java反射中如何获取到当前类的泛型的类型,而且泛型包含多个类类型

展开
收起
magicalman 2021-10-20 15:52:53 411 分享 版权
阿里云 AI 助理回答

在Java反射中,直接获取到当前类声明的泛型类型参数是有限制的,因为泛型类型信息在编译时会经历类型擦除,导致运行时无法直接获取具体的泛型参数类型。但是,如果需要在运行时获取包含在类定义中的泛型参数类型,有以下几种方法可以尝试:

  1. 通过子类或方法的泛型参数: 如果你需要获取的是某个类实例的泛型类型,并且这个类是通过继承或者实现接口的方式指定了泛型类型,那么可以通过该类的子类或者其某个方法(该方法也使用了相同的泛型类型)来间接获取。这是因为子类或具体方法的签名在编译时生成了类型信息,这部分信息在运行时是可访问的。

    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
    
  2. 利用@SuppressWarnings("rawtypes")"和强制类型转换: 对于某些特定场景,如分析已知结构的集合等,可以通过遍历类的字段或方法返回类型,并对泛型化的集合进行特殊处理来尝试获取泛型参数类型。但请注意,这种方法并不通用,且存在类型安全警告。

  3. 保存泛型类型信息: 在设计类时,可以在类中提供一个静态方法或成员变量来保存泛型类型信息,这样在运行时就可以直接访问这些信息了。

    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>,你可以通过类似方式获取TU的具体类型。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: