java - 解析泛型类型描述

标签 java regex parsing

我正在尝试编写一个实用程序方法,它允许我获取字段的定义,包括所有通用参数。为此,我通过 Field.getGenericType() 检索字段的通用类型并解析具有以下语法的类型名称(在 EBNF 中):

generictype = classname [ '<' generictype { ',' ' ' generictype } '>' ]
classname   = package '.' ( letter | '_' ) { letter | digit | '_' }
package     = ( packagepart { '.' packagepart } ) |
packagepart = ( letter | '_' ) { letter | digit | '_' }

我第一次尝试使用正则表达式来解析它

(?<argument>\w+(?:\.\w+)*(?:\<(?<arglist>\g<argument>(?:,\s\g<argument>)*)\>)?)

详情可查看here .这个正则表达式正是我所需要的。现在,Java 正则表达式不支持 \g<name>构造,所以如果我想支持参数深度未知的泛型类型,我就不能使用这种方法。

我可以使用其他方法吗?如果是,我怎样才能实现我想要做的事情?


编辑: 我想要实现这一点的原因是因为我有一个配置并且想将其内容传输到对象的各个字段中。某种反序列化,如果你想那样称呼的话。现在,配置只支持原始类型,java.lang.String , java.util.List<T> , java.util.Map<K, V>java.util.Map.Entry<K, V> .要检索这些类的值,客户端必须提供一个类作为参数,该类将用于反序列化保存在配置中的字符串。因此,我必须确定类的字段使用了哪些通用参数以及哪些 Class es 它们对应。

最佳答案

您可以执行以下操作:

Type type = Field.getGenericType();
if (type instanceof ParameterizedType) {
    ParameterizedType pt = (ParameterizedType) type;
    Class<?> genericType  = (Class<?>) pt.getActualTypeArguments()[0];
}

如果这还不够,只需使用谷歌反射库:https://github.com/google/guava/wiki/ReflectionExplained

关于java - 解析泛型类型描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35999040/

相关文章:

java - 查询远程服务器时如何防止 JCR 节点的本地缓存?

java - OutOfMemoryError 以及如何使运行继续

java - 用java计算利率

regex - RewriteCond 检查目录是否存在索引文件

regex - 正则表达式修饰符(或标志) 'm' 和 's' 之间的区别?

java - 检查不同 ArrayList 的元素是否共享位置

R 正则表达式 : modifying digits of varying lengths at end of string

解析 XML(RSS 提要)的 PHP 错误

parsing - 单词 "lexer"是单词 "parser"的同义词吗?

javascript - JSON解析: Uncaught SyntaxError: Unexpected token e