java – Class.forName等效于从String创建ParameterizedType的

前端之家收集整理的这篇文章主要介绍了java – Class.forName等效于从String创建ParameterizedType的前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

调用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

然后最后解析字符串

CharStream stream = 
    new ANTLRInputStream(
        "java.util.Map

你可以看到工作示例here.

注意

CLASS lexer规则可能有点不准确.此解析器也仅适用于非基本类和参数化类型,但您当然也将其扩展为支持通配符类型.

猜你在找的Java相关文章