获取java.lang.reflect.Type的简单代码

时间:2014-11-20 20:42:30

标签: java generics reflection

GSON的toJson函数接受一个类型参数,该参数在反映对象时检查Type。这对于将对象反射到集合中非常有用。

然而,我能找到获得Type的唯一方法是通过一组丑陋的编码扭曲:

//used for reflection only
@SuppressWarnings("unused")
private static final List<MyObject> EMPTY_MY_OBJECT = null;
private static final Type MY_OBJECT_TYPE;

static {
    try {
        MY_OBJECT_TYPE = MyClass.class.getDeclaredField("EMPTY_MY_OBJECT").getGenericType();
    } catch (Exception e) {
        ...
    }   
}

private List<MyObject> readFromDisk() {

    try {
        String string = FileUtils.readFileToString(new File(JSON_FILE_NAME), null);
        return new Gson().fromJson(string, MY_OBJECT_TYPE);
    } catch (Exception e) {
        ...
    }
}

有没有一种方法可以在不引用内部类变量的情况下初始化Type?伪代码看起来像这样:

private static final Type MY_OBJECT_TYPE = TypeUtils.generate(List.class, MyObject.class);

2 个答案:

答案 0 :(得分:4)

toJson的Javadoc希望回答您的问题

  

typeOfSrc - src的特定通用类型。您可以使用TypeToken类获取此类型。例如,要获取Collection的类型,您应该使用:

Type typeOfSrc = new TypeToken<Collection<Foo>>(){}.getType();

所以在你的实例中。

private static final Type MY_OBJECT_TYPE = new TypeToken<List<MyObject>>(){}.getType();

答案 1 :(得分:0)

也可以这样做:

 private static final Type MY_OBJECT_TYPE = TypeToken.getParameterized(List.class, MyObject.class).getType();