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