如何在运行时从通用类型定义和运行时类型参数构建Java类型的对象?

假设通用类型声明( Java)
class Foo<T> {
    public T bar;
}

在运行时,我如何实例化一个Type对象,该对象表示通过特定类型T参数化的Foo(也仅在运行时才知道)?

解决方法

我想我明白你的问题.你想序列化一个Foo&T,你在运行时有T的类对象(但在编译时它不是固定的).因此,Gson创建一个TypeToken的匿名子类的建议解决方案不起作用,因为这需要参数化类型(例如Foo< String>)在编译时进行硬编码,如果您使用像Foo< ; T&GT ;. 但是,我们来看看Gson站点上的TypeToken方法实际上是如何实现的.您创建一个TypeToken的匿名子类的对象,然后使用其gettype()方法请求其类型参数.类的超类是其元数据的一部分,并且包括其超类的通用参数.因此,在运行时,它可以查看自己的继承层次结构,并找出您用于TypeToken的类型参数,然后返回该类型的java.lang.reflect.Type实例(如果参数化,则为ParameterizedType实例).一旦你得到这个Type实例,你应该把它作为第二个参数传递给toGson(). 我们需要做的就是找到另一种创建ParameterizedType实例的方式. ParameterizedType是一个接口,但不幸的是,公共Java API不提供任何具体的实现,或任何方式动态创建ParameterizedType.似乎有一个名为ParameterizedTypeImpl的类,在私有的Sun API和Gson代码中可以使用( e.g. here).您可以简单地复制代码并将其重命名为您自己的类.然后,创建一个表示Foo< String>在运行时你可以做一些类似新的ParameterizedTypeImpl(Foo.class,new Type [] {String.class},null)(未经测试)

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写:&#160;一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...