可以说我有以下带有注释等的实体类。
@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
的行看起来很有希望,但是我还没有找到获取更多信息的方法吗?也许我疏忽了某些事情...也许我走错了道路...
我找到了不同的答案: