加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:17:38 所属栏目:Java 来源:网络整理
导读:假设通用类型声明( Java) class FooT { public T bar;} 在运行时,我如何实例化一个Type对象,该对象表示通过特定类型T参数化的Foo(也仅在运行时才知道)? 解决方法 我想我明白你的问题.你想序列化一个FooT,你在运行时有T的类对象(但在编译时它不是固定的).因
假设通用类型声明( 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)(未经测试)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读