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.
 Type getOwnerType() 
          Returns a Type object representing the type that this type is a member of.
 Type getRawType() 
          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

你可能感兴趣的:(java,exception,String,Class,interface,reference)