调用java.lang.reflect.Type.toString()提供了非常好的泛型类型表示:
@Test
public void typeToStringWithTypeToken() {
assertEquals("java.util.List
我需要的是Type.toString()方法的反向,即可以从给定的字符串表示创建类型的方法:
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");
}
哪个可以通过以下特殊类型的测试:
@Test
public void justSimpleClassName() throws Exception {
assertEquals(Integer.class,parseTypeString("java.lang.Integer"));
}
@Test
public void listOfInteger() throws Exception {
assertEquals(new TypeToken
我找不到解决这个问题的库或SO问题.
最佳答案
嗯……您可以使用例如antlr4使用以下语法自己完成
type returns[ClassBuilder value]
: cls=CLASS { $value = ClassBuilder.parse($cls.text); }
| cls=CLASS { $value = ClassBuilder.parse($cls.text); }
LT head=type { $value.add($head.value); }
(COMMA tail=type { $value.add($tail.value); })* GT
;
GT : '>'
;
LT : '<'
;
COMMA
: ','
;
CLASS
: ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'$'|'.'|'_')*
;
ClassBuilder的样子
public class ClassBuilder {
private final Class> clazz;
private final List
然后最后解析字符串
CharStream stream =
new ANTLRInputStream(
"java.util.Map
你可以看到工作示例here.
注意