Java 泛型参数的获取

来源:互联网 发布:数据流程图编辑手机版 编辑:程序博客网 时间:2024/05/16 23:57
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