【问题标题】:Jackson TypeReference with dynamic method parameter type具有动态方法参数类型的 Jackson TypeReference
【发布时间】:2021-10-24 16:06:34
【问题描述】:

我希望能够创建带有动态方法参数类型的 Jackson TypeReference,下面的示例使用反射 method.getParameterTypes()1

由于 TypeReference 只接受编译类型参数,但我读到了所以你可以做一些技巧让它也适用于动态类型。

 Method method = methodsMap.getOrDefault("createXXX".toLowerCase(), null);

    if(method != null && myBean!= null){           
        Object retval = method.invoke(myBean, mapper.convertValue(product , new TypeReference<method.getParameterTypes()[0]>(){}));
    }

其中 method.getParameterTypes()[0] 的类型为 java util generic list(类型擦除问题)

List&lt;MyPojo&gt;

【问题讨论】:

    标签: java reflection jackson


    【解决方案1】:

    您根本不应该使用getParameterTypes。您应该使用getGenericParameterTypes 来获取Type。然后,您可以将 Type 传递给 TypeFactory 以获得 JavaTypeconvertValue 也接受。

    Type parameterType = method.getGenericParameterTypes()[0];
    method.invoke(myBean, mapper.convertValue(
            product, 
            mapper.getTypeFactory().constructType(parameterType)
        )
    );
    

    【讨论】:

    • method.getGenericParameterTypes()[0] 属于 List
    • @TalAvissar 你的意思是......?
    • 我想知道您上面显示的示例是否也适用于 void foo(String param1, List lst);相比 void fromArrayToCollection(T[] a, Collection c)
    • 这对这两种方法都不起作用,因为它们有 2 个参数,但您使用 invoke 只用一个参数调用它们。也许你没有把你的情况解释清楚,或者你根本不知道你在做什么......
    • @TalAvissar 如果我们删除String param1T[] a,那么这将适用于前一种方法,但不适用于后者,因为后者的参数类型有一个类型变量,你可以' t 将 JSON 转换为其中包含类型变量的类型。但似乎你在这里有一个数组。如果知道数组的Class,就可以构造一个不带类型变量的类型,可以将JSON转换成这个类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多