gpt4 book ai didi

java - 通过反射在运行时获取通用字段类型

转载 作者:行者123 更新时间:2023-11-29 04:57:50 25 4
gpt4 key购买 nike

我无法通过 MyClass 的反射访问 id 的运行时类型。

public abstract class AbstractEntity<T> {

@Id
private T id; //I need to access the runtime class of T

}

public class MyClass extends AbstractEntity<Long> {}

我正在使用 java 反射并且可以访问父类(super class)中的 id 字段

我尝试使用:

  • field.getGenericType():返回值为 TTypeVariableImpl
  • field.getType() 返回 Object

我想访问 Long 作为字段类型。

我正在编写一个库供其他人使用,但存在一些问题:

  1. 其实我并不知道这个类型是泛型还是常规类型,我只知道它被注解了@id
  2. 我不知道这个字段在类层次结构中的什么位置。

这是我用来获取类层次结构中所有字段的方法。

private Set<Field> getAllFields(final Object object) {
final Set<Field> fields = new HashSet<>();
fields.addAll(Arrays.asList(object.getClass().getDeclaredFields()));
Class<?> superclass = object.getClass().getSuperclass();
while (superclass != null) {
fields.addAll(Arrays.asList(superclass.getDeclaredFields()));
superclass = superclass.getSuperclass();
}
return fields;
}

然后我过滤此列表以查找用 @Id 注释的字段,其中应该只有一个。

最佳答案

泛型在运行时不会具体化。这意味着信息在运行时不存在。

一种方法是了解泛型参数化类型的类类型,即 Class<T> entityClass .

有几种方法可以实现这一点。您可以拥有默认构造函数并反射性地获取类​​类型:

this.entityClass= (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];

或者创建一个构造函数,在构造函数上传递通用类类型:

protected AbstractEntity(Class<T> entityClass) {
this.entityClass = entityClass;
}

然后,您的具体实体类可以默认传递其类类型,如下所示:

public class MyClass extends AbstractEntity<Long> {

public MyClass() {
super(Long.class);
}
}

关于java - 通过反射在运行时获取通用字段类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33100133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com