获取ArrayList声明的通用类型

时间:2018-06-22 09:35:36

标签: java generics java-8

可以说我有以下带有注释等的实体类。

@Entity
@Table(name = "FIRST_TABLE")
public class AnnotationTestClass implements Serializable {
  private static final long serialVersionUID = -6159126853399658427L;

  @Column(name = "X1", length = 20)
  private String name;
  @Column(name = "EXTERN_KEY", precision = 15)
  private BigDecimal key;

此外,我还有以下代码部分:

List<AnnotationTestClass> tableToBeExported = new ArrayList<>();

PTestX p = new PTestX(tableToBeExported);

p.method();

以及上述PTestX类的声明。

  public class PTestX {
    private List<? extends Serializable> tableToBeExported;

    public PTestX(List<? extends Serializable> tableToBeExported) {
      this.tableToBeExported = tableToBeExported;
    }

    public void method() {
      ...
    }
  }

因此,我想获得的是用法中的泛型类型,这意味着我想要以下结果:AnnotationTestClass访问此实体并通过反射从AnnotationTestClass提取信息。

我已经在method()中尝试了几种方法来获取如下信息:

public void method() {
  Type[] genericInterfaces = tableToBeExported.getClass().getGenericInterfaces();
  for (int i = 0; i < genericInterfaces.length; i++) {
    Type type = genericInterfaces[i];
    System.out.println("Type:" + type.getTypeName());
  }

  TypeVariable<?>[] typeParameters2 = tableToBeExported.getClass().getTypeParameters();
  for (int i = 0; i < typeParameters2.length; i++) {
    TypeVariable<?> typeVariable = typeParameters2[i];
    System.out.println("getTypeParameters: " + typeVariable.getGenericDeclaration());
  }

  Type[] classes = tableToBeExported.getClass().getGenericInterfaces();
  for (int i = 0; i < classes.length; i++) {
    Type type = classes[i];
    System.out.println("i:" + i + " genericInterfaces: type:" + type.getTypeName());
    TypeVariable<?>[] typeParameters = type.getClass().getTypeParameters();
    for (int j = 0; j < typeParameters.length; j++) {
      TypeVariable<?> typeVariable = typeParameters[j];
      System.out.println("    tV:" + typeVariable.getName());
      Type[] genericSuperclass = typeVariable.getClass().getGenericInterfaces();
      for (int k = 0; k < genericSuperclass.length; k++) {
        Type type2 = genericSuperclass[k];
        System.out.println("    GS:" + type2.getTypeName());
      }
    }
  }
}

通过使用method的上述实现,我将获得以下输出:

Type:java.util.List<E>
Type:java.util.RandomAccess
Type:java.lang.Cloneable
Type:java.io.Serializable
getTypeParameters: class java.util.ArrayList
i:0 genericInterfaces: type:java.util.List<E>
i:1 genericInterfaces: type:java.util.RandomAccess
    tV:T
    GS:java.lang.reflect.TypeVariable<D>
i:2 genericInterfaces: type:java.lang.Cloneable
    tV:T
    GS:java.lang.reflect.TypeVariable<D>
i:3 genericInterfaces: type:java.io.Serializable
    tV:T
    GS:java.lang.reflect.TypeVariable<D>

但是目前我还没有找到获取实型AnnotationTestClass的方法。

带有getTypeParameters: class java.util.ArrayList的行看起来很有希望,但是我还没有找到获取更多信息的方法吗?也许我疏忽了某些事情...也许我走错了道路...

我找到了不同的答案:

其他类似:  * Get generic type of java.util.List

0 个答案:

没有答案