【问题标题】:How to extract the type argument from a Java bean property?如何从 Java bean 属性中提取类型参数?
【发布时间】:2015-07-29 13:56:00
【问题描述】:

我有一个任意的 Java bean,如下所示:

class SomeBean {

    public Map<String, SomeOtherBean> getOtherBeans() { ... }
    public void setOtherBeans(Map<String, SomeOtherBean> otherBeans) { ... }

}

我想用泛型方法提取SomeOtherBean 类型。在存在 Java 类型擦除的情况下,这是否可能?

【问题讨论】:

    标签: java reflection javabeans type-erasure


    【解决方案1】:

    是的,即使在游戏中进行擦除也是可能的。

    Magnolia 的TypeMappingImpl [1](根据 GPL 和 Magnolia 网络协议的双重许可)的以下实现从 setter 方法中提取所有类型参数,直到第一级:

    private List<Class<?>> inferGenericTypes(Method method) {
        List<Class<?>> inferredTypes = new ArrayList<Class<?>>();
        Type[] parameterTypes = method.getGenericParameterTypes();
        for (Type parameterType : parameterTypes) {
            if (parameterType instanceof ParameterizedType) {
                ParameterizedType type = (ParameterizedType) parameterType;
                for (Type t : type.getActualTypeArguments()) {
                    if (t instanceof ParameterizedType) {
                        // this the case when parameterized type looks like this: Collection<List<String>>
                        // we care only for raw type List
                        inferredTypes.add((Class<?>) ((ParameterizedType) t).getRawType());
                    } else if (t instanceof WildcardType) {
                        WildcardType wildcardType = (WildcardType) t;
                        if (wildcardType.getUpperBounds().length > 0) {
                            // upper bounds (? extends Number)
                            inferredTypes.add((Class<?>) wildcardType.getUpperBounds()[0]);
                        } else {
                            // lower bounds (? super Number)
                            inferredTypes.add((Class<?>) wildcardType.getLowerBounds()[0]);
                        }
                    } else {
                        inferredTypes.add((Class<?>) t);
                    }
                }
            }
        }
        return inferredTypes;
    }
    

    [1]:来自包info.magnolia.jcr.node2bean.impl

    【讨论】:

      猜你喜欢
      • 2020-01-04
      • 1970-01-01
      • 2011-08-04
      • 2023-04-02
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多