我有以下类结构:
public class GenClass<T> {
public T elem;
}
我按以下方式使用它:
public class Test {
public GenClass<UUID> data;
现在我想使用 data 的 Field 对象获取 elem 的类型(Test.class.getField("data")
)
但是当我使用 getType
检索类时,通用信息被剥离。
如何将通用信息从 getGenericType
映射到类对象以检索具有正确类型的字段?
编辑: 由于存在一些误解,我尝试澄清我的问题。 考虑这个例子:
public class AClass<T, Q> {
public Q elem;
// some other code using T...
}
public class BClass<T, Q> {
public T elem;
// some other code using Q...
}
现在我想要一个函数来获取 elem 的类:
public class Test {
public AClass<UUID, String> a;
public BClass<Integer, Float> b;
void do() throws Exception {
Field aField = Test.class.getField("a");
Field bField = Test.class.getField("b");
getType(aField, "elem"); // should return String.class
getType(bField, "elem"); // should return Integer.class
}
Class<?> getType(Field f, String classField) {
// ???
}
}
我需要如何实现 getType
以获得我想要的结果?
最佳答案
你有 Type
你的领域对应的对象data
, 从调用 getGenericType
.
Type t = f.getGenericType(); // f is your Field
Type
interface它的实现代表了这里可能出现的类型的不同情况。因为data
的类型是 GenClass<UUID>
,用类型参数参数化,Type
这里返回的其实是一个ParameterizedType
.
ParameterizedType pt = (ParameterizedType) t;
通常可以有多个泛型类型参数,但这里只有一个。调用 ParameterizedType
's getActualTypeArguments
method .
Type parameter = pt.getActualTypeArguments()[0];
是的,我们还有一个Type
实例,但这一个表示 Field
的泛型类型参数, 而不是 Field
本身。因为您在 Test
中提供了一个类类型类,这个Type
就是一个普通的 Class
-- UUID.class
.
System.out.println(parameter instanceof Class);
System.out.println(parameter == UUID.class);
输出:
true
true
关于java - 使用 Java Reflections 获取通用类字段类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32783591/