【问题标题】:Simple code to get java.lang.reflect.Type获取 java.lang.reflect.Type 的简单代码
【发布时间】:2015-01-18 21:06:15
【问题描述】:

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);

【问题讨论】:

  • 您是否尝试使用正在查看的界面编写方法并遇到问题?
  • @Chris 抱歉,我不明白你的问题。
  • @patstuart toJson 的 javadoc 看起来他们可能会回答你的问题。 Type typeOfSrc = new TypeToken&lt;List&lt;MyObject&gt;&gt;(){}.getType();
  • @patstuart 我指的是您的伪代码 - private static final Type MY_OBJECT_TYPE = TypeUtils.generate(List.class, MyObject.class); - 您是否尝试编写自己的 TypeUtils.generate 版本来实现这个提议的接口?
  • 其实在2019年有这么一件事,几乎就是你在伪代码里表达的:org.apache.commons.lang3.reflect.TypeUtils.parameterize(...)见:commons.apache.org/proper/commons-lang/javadocs/api-3.9/org/…

标签: java generics reflection


【解决方案1】:

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();

【讨论】:

    【解决方案2】:

    也可以这样做:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-04
      • 2017-05-31
      • 1970-01-01
      • 2015-12-19
      • 2012-05-13
      • 2015-10-26
      • 1970-01-01
      • 2014-08-03
      相关资源
      最近更新 更多