加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 01:06:30 所属栏目:Java 来源:网络整理
导读:调用java.lang.reflect.Type.toString()提供了非常好的泛型类型表示: @Testpublic void typeToStringWithTypeToken() { assertEquals("java.util.List 我需要的是Type.toString()方法的反向,即可以从给定的字符串表示创建类型的方法: public static Type p

调用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规则可能有点不准确.此解析器也仅适用于非基本类和参数化类型,但您当然也将其扩展为支持通配符类型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读