Gson中序列化带泛型的类型的方式:
其中Type为java.lang.reflect.Type接口
3个方法,用于获取泛型类型。
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. |
原理:
对于一个类如果继承了一个带具体泛型参数的泛型类,则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