Wywołanie java.lang.reflect.Type.toString()
zapewnia bardzo ładne reprezentację typów generycznych:Class.forName równoważne do tworzenia ParameterizedType jest z String
@Test
public void typeToStringWithTypeToken() {
assertEquals("java.util.List<java.lang.String>", new TypeToken<List<String>>() {}.getType().toString());
}
Co potrzebne jest odwrotnością Type.toString()
metody, czyli metodę, która może tworzyć Type
S z danym ciągiem reprezentacja:
public static Type parseTypeString(String typeString) throws ClassNotFoundException {
if (typeString.indexOf('<') == -1) {
return Class.forName(typeString);
}
// ??? how to implement rest
throw new IllegalStateException("not implemented");
}
które mogą przekazać następujące testy z wyspecjalizowanych typów:
@Test
public void justSimpleClassName() throws Exception {
assertEquals(Integer.class, parseTypeString("java.lang.Integer"));
}
@Test
public void listOfInteger() throws Exception {
assertEquals(new TypeToken<List<Integer>>() {}.getType(), parseTypeString("java.util.List<java.lang.Integer>"));
}
@Test
public void complexType() throws Exception {
assertEquals(new TypeToken<Map<List<Integer>, Set<String>>>() {}.getType(), parseTypeString("java.util.Map<java.util.List<java.lang.Integer>, java.util.Set<java.lang.String>>"));
}
Nie mogę znaleźć biblioteki lub pytania SO, które rozwiązują ten problem.
To wspaniała odpowiedź! Przetestuję to i udzielę dalszych informacji zwrotnych. Ludzie mogą potrzebować zauważyć trudną część implementacji, używając 'ParameterizedTypeImpl' z ** private ** API ([ParameterizedTypeImpl.java] (http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/ 687fd7c7986d/src/share/classes/sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl.java)). Domyślam się, że ludzie w Javie próbują zniechęcić nas zwykłych śmiertelników wykonujących czarną magię, nie dostarczając publicznej implementacji 'ParameterizedType'. – b10y
@ b10y afaik jest implementacja ParameterizedType w guava, ale nie ma problemu z jej implementacją za pomocą rąk – vsminkov