我正在尝试编写一个实用程序方法,它允许我获取字段的定义,包括所有通用参数。为此,我通过 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/