美文网首页
Java 怎么获取传入泛型类的具体类型?

Java 怎么获取传入泛型类的具体类型?

作者: 黄耀鸿 | 来源:发表于2020-09-28 23:15 被阅读0次

在 Java 反射中,对于一般的类,我们可以通过对象.getClass来获得类对象,然后通过类对象.getFields()可以获得类下的字段对象数组,以及字段对象.getType()来获得字段的具体类型,如下面源码中carClass.getFields()[0].getType():int

但如果是泛型类(参见源码中的Foo<T>类),因为其具体类型是外部传入的,引起 Java反射是无法获取到传入泛型的具体类型的,如字段对象.getType输出 Object(参见源码中输出fooClass.getFields()[0].getType():class java.lang.Object

Gson的TypeToken解决了 Java 泛型反射问题,通过定义一个匿名内部类new TypeToken<Foo<Integer>>(){},然后可以获取具体的泛型类型。

源码如下:

package test.onjava;

import com.google.gson.reflect.TypeToken;

class TestGeneric {

    class Car {
        public int wheel;
        protected int color; // carClass.getFields().length 不包含这个
    }

    class Foo<T> {
        public T value;
        public String key;
    }

    void testGeneric(){
        // 一般类
        System.out.println("-----------------------Normal class--------");
        Car car = new Car();
        Class carClass = car.getClass();

        System.out.println("                    car.getClass():" + carClass);

        System.out.println("       carClass.getFields().length:" + carClass.getFields().length);

        System.out.println(" carClass.getFields()[0].getType():" + carClass.getFields()[0].getType());

        // 泛型类
        System.out.println("-----------------------Generic class--------");
        Foo foo = new Foo<Integer>();
        Class fooClass = foo.getClass();

        System.out.println("                    foo.getClass():" + fooClass);

        System.out.println("       fooClass.getFields().length:" + fooClass.getFields().length);

        System.out.println(" fooClass.getFields()[0].getType():" + fooClass.getFields()[0].getType());


        // Gson
        System.out.println("----------------------Gson TypeToken---------");
        TypeToken typeToken= new TypeToken<Foo<Integer>>(){};

        System.out.println("             typeToken.getRawType:" + typeToken.getRawType());

        System.out.println("                typeToken.getType:" + typeToken.getType());
    }

}

输出

-----------------------Normal class--------
                    car.getClass():class test.onjava.TestGeneric$Car
       carClass.getFields().length:1
 carClass.getFields()[0].getType():int
-----------------------Generic class--------
                    foo.getClass():class test.onjava.TestGeneric$Foo
       fooClass.getFields().length:2
 fooClass.getFields()[0].getType():class java.lang.Object
----------------------Gson TypeToken---------
             typeToken.getRawType:class test.onjava.TestGeneric$Foo
                typeToken.getType:test.onjava.TestGeneric$Foo<java.lang.Integer>

相关文章

  • Java 怎么获取传入泛型类的具体类型?

    在 Java 反射中,对于一般的类,我们可以通过对象.getClass来获得类对象,然后通过类对象.getFiel...

  • Java如何在运行时获取泛型的类型

    Java泛型是伪泛型,会在编译完成时进行类型的擦除,我们无法在运行时获取泛型参数的具体类型(类型擦除会被替换成泛型...

  • 九、泛型

    九、泛型 尽量不要写这种有能与泛型方法重载的代码,有迷惑性 限定传入 T 的类型 泛型数组 Java 不支持泛型类...

  • 泛型 枚举 反射 动态代理 类加载 类的生命周期--复习笔记

    泛型 Java中没有所谓的泛型数组一说 list E表示类型形参 可以接受具体的类型实参; 泛型接口 泛型类...

  • Java中的泛型

    一 泛型是什么泛型最精准的定义:参数化类型。具体点说就是处理的数据类型不是固定的,而是可以作为参数传入。定义泛型类...

  • Java泛型教程

    Java泛型教程导航 Java 泛型概述 Java泛型环境设置 Java泛型通用类 Java泛型类型参数命名约定 ...

  • Java 完美获取泛型类型(包含嵌套的泛型)

    完美获取泛型类型(包含嵌套多层的泛型) 1. 工具类 获取泛型类型工具类 2. 使用方法 2.1. 集成接口带有泛...

  • 泛型

    泛型类 是在实例化类的时候指明泛型的具体类型 泛型方法 是在调用方法的时候指明泛型的具体类型 泛型方法中是用...

  • Java 泛型

    《Thinking in Java》 第15章 泛型 泛型理解 一般的类和方法,只能使用具体的类型:要么是基本类型...

  • JAVA 核心笔记 || [xxx] 泛型

    泛型 JAVA 的参数化类型 称为 泛型 泛型类的设计 Learn12.java 运行

网友评论

      本文标题:Java 怎么获取传入泛型类的具体类型?

      本文链接:https://www.haomeiwen.com/subject/vaqsuktx.html