java - 使用 Java Reflections 获取通用类字段类型

标签 java generics reflection

我有以下类结构:

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/

相关文章:

java - 是否可以在 Java AutoValue 中向集合添加值?

java - JFrame内容未完全显示

java.lang.ClassNotFoundException : org. Spark_project.guava.collect.MapMaker

delphi - 通用工厂

java - 如何解决 Pane.setConstraints() 方法的不可见性

java - Java 中的通用 addListener

java - 如何安全地将java对象转换为泛型集合?

c# - 如何找到带有 params 参数的方法的用法,以使参数不为空?

java - 默认的 ReflectPermissions 是什么以及如何更改它们?

java - 用java代码构造字符串的干净方法是什么?