Java 泛型参数的获取

Gson中序列化带泛型的类型的方式:

        Type fooType = new TypeToken<Foo<Bar>>() {}.getType();
        gson.toJson(foo, fooType);

        gson.fromJson(json, fooType);

其中Type为java.lang.reflect.Type接口

ParameterizedType为Type的子接口包含

 Type[]getActualTypeArguments() 
          Returns an array of Type objects representing the actual type arguments to this type.
 TypegetOwnerType() 
          Returns a Type object representing the type that this type is a member of.
 TypegetRawType() 
          Returns the Type object representing the class or interface that declared this type.
3个方法,用于获取泛型类型。



原理:

对于一个类如果继承了一个带具体泛型参数的泛型类,则JVM可以获取其父类的泛型参数。

    public static void main(String[] args) {

        // 可以获取泛型参数String
        class AnonymousArrayListA extends ArrayList<String> {

        }

        AnonymousArrayListA aa = new AnonymousArrayListA();
        Class typeA = (Class) ((ParameterizedType) aa.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        System.out.println(typeA.getSimpleName());


        // 无法获取泛型参数
        class AnonymousArrayListB<T> extends ArrayList<T> {

        }
        
        AnonymousArrayListB<String> bb = new AnonymousArrayListB<String>();
        try {
            Class typeB = (Class) ((ParameterizedType) bb.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
            System.out.println(typeB.getSimpleName());
        } catch (Exception e) {
            System.out.println("Get type failed.");
        }
    }	

Type fooType = new TypeToken<Foo<Bar>>() {}.getType(); 即通过继承了一个包含具体泛型参数的TypeToken的匿名类来获取Foo<Bar>这个类型,用于序列化/反序列化。reference: http://www.artima.com/weblogs/viewpost.jsp?thread=208860
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值