Java Reflection - 获取泛型类型,可能是泛型的泛型?

问题描述 投票:0回答:1

我需要确定在运行时应用于 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
的类型/参数化类型?

java generics reflection
1个回答
0
投票

您可以使用 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]

© www.soinside.com 2019 - 2024. All rights reserved.