2015-09-25 32 views
2

我有下面的类结构的泛型类字段类型:获得与Java思考

public class GenClass<T> { 
    public T elem; 
} 

我使用的方式如下:

public class Test { 
    public GenClass<UUID> data; 

现在我想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得到我想要的结果?

+0

检查http://stackoverflow.com/questions/1901164/get-type-of-a-generic-parameter-in-java-with-reflection – user2953113

+0

但我不知道,该字段的实际类型参数中的哪一个用于elem。也许我有一个像AClass 这样的课程,然后声明'B数据'。我怎么知道,数据是第三种类型的论点? – darkbit

回答

1

您有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 
+0

看看我编辑的问题,以更好地解释我的问题! – darkbit