java.lang.reflect.Type.toString()
Aufruf bietet sehr schöne Darstellung von generischen Typen erstellen:Class.forName Äquivalent für ParameterizedType der von String
@Test
public void typeToStringWithTypeToken() {
assertEquals("java.util.List<java.lang.String>", new TypeToken<List<String>>() {}.getType().toString());
}
Was ich brauche, ist die Umkehrung der Type.toString()
Verfahren, dh ein Verfahren, das Type
s aus gegebenen Zeichenfolge erstellen Darstellung:
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");
}
Welche folgenden Tests mit spezialisierten Arten passieren kann:
@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>>"));
}
Ich konnte keine Bibliothek oder eine SO-Frage finden, die dieses Problem behebt.
Das ist eine gute Antwort! Ich werde es testen und weitere Rückmeldungen geben. Benutzer müssen möglicherweise den kniffligen Teil der Implementierung bemerken, indem sie 'ParameterizedTypeImpl' von der ** privaten ** API verwenden ([ParameterizedTypeImpl.java] (http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/ 687fd7c7986d/src/teilen/Klassen/Sonne/reflektieren/Generika/reflectiveObjects/ParameterizedTypeImpl.java)). Ich denke, Java-Leute versuchen, uns Sterbliche, die schwarze Magie durchführen, durch Bereitstellung einer öffentlichen 'ParameterizedType'-Implementierung zu entmutigen. – b10y
@ b10y afaik gibt es Implementierungen in ParameterizedType in Guave, aber es gibt kein Problem, es von Hand zu implementieren – vsminkov