我需要确定在运行时应用于 Java
Object
的泛型类型。对于像Map<String, String>
这样的情况,这相当容易。我的代码看起来像这样:
protected Class<?>[] getGenericParameterTypes(Field field) {
ParameterizedType pt = (ParameterizedType) field.getGenericType();
Type[] types = pt.getActualTypeArguments();
Class<?>[] ptClasses = new Class<?>[types.length];
for (int i = 0; i < types.length; i++) {
ptClasses[i] = (Class<?>) types[i];
}
return ptClasses;
}
这对于简单的用例来说效果很好。我正在努力解决的是一种情况,我有一个更复杂的
Map
,比如Map<String, List<String>>
或Map<String, List<List<String>>>
。如何应用此逻辑来获取此 Map
的类型/参数化类型?
您可以使用 GeantyRef(我是维护者)来实现 Java 中几乎任何类型级别的魔法:
protected Class<?>[] getGenericParameterTypes(Field field) {
List<Class<?>> classes = new ArrayList<>();
GenericTypeReflector.transform(field.getAnnotatedType(), new TypeVisitor() {
@Override
protected AnnotatedType visitClass(AnnotatedType type) {
classes.add((Class<?>) type.getType());
return super.visitClass(type);
}
});
return classes.toArray(new Class[0]);
}
这将收集所有叶子类型。例如。对于
Map<String, Map<Integer, List<Optional<Double>>>>
,您会得到 [String, Integer, Double]
。