首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Spring中,有没有办法从AbstractHttpMessageConverter的support()方法中获取集合的泛型类型?

在Spring中,可以通过反射的方式从AbstractHttpMessageConverter的support()方法中获取集合的泛型类型。具体步骤如下:

  1. 首先,需要获取到AbstractHttpMessageConverter的子类实例,可以通过自定义的HttpMessageConverter实现类或者使用Spring提供的默认实现类。
  2. 然后,通过反射获取到AbstractHttpMessageConverter的support()方法。
  3. 调用support()方法,并传入一个ParameterizedTypeReference类型的参数,该参数用于获取集合的泛型类型。
  4. 最后,通过ParameterizedTypeReference的getType()方法获取到集合的泛型类型。

需要注意的是,AbstractHttpMessageConverter的support()方法是用于判断当前的HttpMessageConverter是否支持某个类型的消息转换,而不是用于获取集合的泛型类型。因此,需要借助反射来实现这个功能。

以下是一个示例代码:

代码语言:txt
复制
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

public class SpringHttpMessageConverterDemo {

    public static void main(String[] args) throws Exception {
        // 获取AbstractHttpMessageConverter的子类实例,这里以ListHttpMessageConverter为例
        HttpMessageConverter<List<String>> converter = new ListHttpMessageConverter<>();

        // 获取AbstractHttpMessageConverter的support()方法
        Method supportMethod = AbstractHttpMessageConverter.class.getDeclaredMethod("supports", Class.class);

        // 设置方法可访问
        supportMethod.setAccessible(true);

        // 调用support()方法,并传入ParameterizedTypeReference类型的参数
        boolean support = (boolean) supportMethod.invoke(converter, new ParameterizedTypeReference<List<String>>() {});

        if (support) {
            // 获取ParameterizedTypeReference的泛型类型
            Type type = ((ParameterizedType) supportMethod.getGenericParameterTypes()[0]).getActualTypeArguments()[0];
            System.out.println("集合的泛型类型:" + type);
        }
    }

    static class ListHttpMessageConverter<T> extends AbstractHttpMessageConverter<List<T>> {
        @Override
        protected boolean supports(Class<?> clazz) {
            return List.class.isAssignableFrom(clazz);
        }

        @Override
        protected List<T> readInternal(Class<? extends List<T>> clazz, HttpInputMessage inputMessage) {
            return null;
        }

        @Override
        protected void writeInternal(List<T> list, HttpOutputMessage outputMessage) {
        }
    }
}

上述代码中,我们自定义了一个ListHttpMessageConverter类,继承自AbstractHttpMessageConverter,并实现了其中的抽象方法。在main方法中,我们通过反射获取到AbstractHttpMessageConverter的support()方法,并调用该方法来判断是否支持List类型的消息转换。如果支持,我们通过反射获取到ParameterizedTypeReference的泛型类型,即集合的泛型类型。

需要注意的是,以上代码只是演示了如何通过反射获取集合的泛型类型,并不涉及具体的腾讯云产品和链接地址。如果需要了解腾讯云相关产品和产品介绍,可以参考腾讯云官方文档或者咨询腾讯云的技术支持。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

什么是以及集合使用

大家好,又见面了,我是你们朋友全栈君。 什么是最常与集合使用,因为最开始开始被加入Java就是为了解决集合向下转型一类问题。...如果我们有这样一个需求:定义一个描述类圆,要求圆数据类型是不确定,也就是声名属性时候,属性类型是不确定。比如描述类圆中有半径,要求半径可以用int,也可以用double。...那么此时数据类型不确定,就使用,把数据类型参数化。...集合使用 List中使用 我们创建集合时使用来声明List集合只能保存Dog类对象 List dogs=new ArrayList(); 创建Dog类对象 Dog dog1...Dog类型 总结: 集合中使用目的就是为了解决向下转型问题,具体化之后,集合只能存储与具体化之后类型

2K20

SpringAOP——Advice方法获取目标方法参数

获取目标方法信息 访问目标方法最简单做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理连接点。...方法调用切点方法返回值:原返回值:改变后参数1 、bb,这是返回结果后缀 结果可以看出:在任何一个织入增强处理,都可以获取目标方法信息。...同一个切面类里两个相同类型增强处理同一个连接点被织入时,Spring AOP将以随机顺序来织入这两个增强处理,没有办法指定它们织入顺序。...如果只要访问目标方法参数,Spring还提供了一种更加简洁方法:我们可以程序中使用args来绑定目标方法参数。...我们AdviceManager定义一个方法,该方法第一个参数为Date类型,第二个参数为String类型,该方法执行将触发上面的access方法,如下: //将被AccessArgAdviceTest

5.9K20

根据java编译器规则在Class搜索匹配指定参数类型方法(GenericMethod)

因为项目的需要,设计了一个满足特定需要代码自动生成工具。开发过程需要根据方法名和方法参数类型数组指定根据java编译器规则找到与之最匹配方法。...void test(int a,URL b,T c){ } public void test(T1 a,T2 b,T3 c){ } } 于是对java关于方法匹配方式做了研究...,发现java编译器匹配方法时,对参数匹配是遵循从左到右顺序来一个个检查,根据这个规则写了下面的方法来实现方法精确匹配。.../** * @param clazz 要搜索类 * @param name 方法名 * @param parameterTypes 希望匹配参数类型数组 *...,可能会出现返回并不匹配方法结果,不过应用场景中有别的措施做了保证,所以不会有问题,你可以根据自己需要再补充一些检查代码。

1.6K30

C++反射调用.NET(三) 使用非集合委托方法C++列表对象list C++传递集合数据给.NET创建List实例反射静态方法反射调用索引器当委托遇到协变和逆变C++CLI

.NET与C++之间传输集合数据 上一篇《C++反射调用.NET(二)》,我们尝试了反射调用一个返回DTO对象.NET方法,今天来看看如何在.NET与C++之间传输集合数据。...C++端看来,SaveUsers方法参数对象是一个集合,但是具体是什么对象并不知道,所以需要反射出集合类型,同时还需要构建这样一个集合对象实例。...创建List实例 我们使用List来做集合对象,C#,我们可以通过下面的方式得到List类型,然后进一步创建对象实例: Type t= typeof(List); 但是,对应C+...一切准备就绪,下面可以通过以下步骤提交集合数据给.NET方法了: 1,反射.NET方法获取参数形参类型; 2,创建此形参List对象实例; 3,遍历C++集合(列表list),将结构数据赋值给动态创建实体类对象...NET程序端,我们使用了弱类型集合,综合起来还是反射+委托方法执行,效率要高。

9K100

【小家SpringSpring MVC容器web九大组件之---HandlerAdapter源码详解---HttpMessageConverter 消息转换器详解

后面会是重磅内容~ ---- HttpMessageConverter接口是Spring3.0之后新增一个接口,它负责将请求信息转换为一个对象(类型为T),并将对象(类型为T)绑定到请求方法参数或输出为响应信息...// @since 3.0 Spring3.0后推出 是个接口 // 策略接口,指定可以HTTP请求和响应转换为HTTP请求和响应转换器 public interface HttpMessageConverter...、GenericHttpMessageConverter(Spring3.2出来,支持到了) FormHttpMessageConverter:form表单提交/文件下载 名字知道,它和Form...对于控制,有如下特点: 最广可以选择Object,不过Object并不都是可以序列化,但是子类可以覆盖supports方法中进一步控制,因此选择Object是可以 最符合是Serializable...,既完美满足定义,本身也是个Java序列化/反序列化充要条件 自定义基类Bean,有些技术规范要求自己代码所有bean都继承自同一个自定义基类BaseBean,这样可以Serializable

2.4K10

三万字盘点Spring最最核心9大核心功能

这个接口主要作用是可以处理带有类型转换,主要就是面向集合数组转换操作,Spring默认提供实现就可以看出 那Converter跟GenericConverter有什么关系呢?...处理其实是一块相对独立东西,因为它就只是一个工具类,只还不过这个工具类Spring却是无处不在!...... indexes)就可以获取指定位置参数ResolvableType,方法参数就是指第几个位置参数,0开始 比如获取第一个位置对应ResolvableType类型 //获取第一个参数对应...类型,只需要通过ResolvableType#resolve()方法就可以获取到ResolvableType类型对应class类型,这样就可以获取到一个参数class类型 //获取第一个参数对应...ResolvableType,父类或者是参数又可能有之类,只需要一步一步获取就可以了,当需要获取到具体class类型时候,通过ResolvableType#resolve()方法就行了。

11810

三万字盘点Spring 9大核心基础功能

这个接口主要作用是可以处理带有类型转换,主要就是面向集合数组转换操作,Spring默认提供实现就可以看出 那Converter跟GenericConverter有什么关系呢?...处理其实是一块相对独立东西,因为它就只是一个工具类,只还不过这个工具类Spring却是无处不在!...... indexes)就可以获取指定位置参数ResolvableType,方法参数就是指第几个位置参数,0开始 比如获取第一个位置对应ResolvableType类型 //获取第一个参数对应...类型,只需要通过ResolvableType#resolve()方法就可以获取到ResolvableType类型对应class类型,这样就可以获取到一个参数class类型 //获取第一个参数对应...ResolvableType,父类或者是参数又可能有之类,只需要一步一步获取就可以了,当需要获取到具体class类型时候,通过ResolvableType#resolve()方法就行了。

30830

JavaEE开发之SpringMVC自定义消息转换器与文件上传

继承类时,我们将指定为StudentModel类,然后该类构造器,我们创建了一个新媒体类型。该媒体类型就是我们自己定义,并且指定了相应编码方式。...重写support()方法,我们来判断所支持Class是否与StudentModelClass相同。如下所示: ? 然后下方两个重写方法是负责数据输入和输出方法。...readInternal()方法,就负责接收客户端所发过来消息,并按照我们自定义媒体类型进行解析。...下方代码段就是Spring配置文件对上述自定义消息转发器配置,重写extendMessageConverters()方法,将上述自定义消息转发对象进行添加即可,具体代码如下所示。 ?...下方我们指定请求方式是POST方式,然后请求体重使用@RequestParam("参数名")来获取相应上传文件。

1.1K100

Java 基础常见知识点&面试题总结(下),2022 最新版!

使用方式有哪几种? 一般有三种使用方式:类、接口、方法。...1.类: //此处T可以随便写为任意标识,常见的如T、E、K、V等形式参数常用于表示 //实例化类时,必须指定T具体类型 public class Generic{ private...; java 只是一个占位符,必须在传递类型后才能使用。...类实例化时才能真正传递类型参数,由于静态方法加载先于类实例化,也就是说类还没有传递真正类型参数,静态方法加载就已经完成了,所以静态方法是没有办法使用类上声明。...构建集合工具类(参考 Collections sort, binarySearch 方法)。

45240

阿里巴巴面试题- - -Java体系最新面试题(4)

15、 常用特点是Java SE 1.5之后特性, 《Java 核心技术》定义是:“” 意味着编写代码可以被不同类型对象所重用。“”,顾名思义,“泛指类型”。...我们提供了泛指概念,但具体执行时候却可以有具体规则来约束,比如我们用非常多ArrayList就是个类,ArrayList作为集合可以存放各种元素,如Integer, String,自定义各种类型等...,但在我们使用时候通过具体规则来约束,如我们可以约束集合只存放Integer类型元素,如ListInteger> iniData = new ArrayList()使用好处?...以集合来举例,使用好处是我们不必因为添加元素类型不同而定义不同类型集合,如整型集合类,浮点集合类,字符串集合类,我们可以定义一个集合来存放整型、浮点,字符串数据,而这并不是最重要,因为我们只要把底层存储设置了...java中提供了以下四种创建对象方式:new创建新对象通过反射机制采用clone机制通过序列化机制17、有没有可能两个不相等对象有相同hashcode有可能.产生hash冲突时,两个不相等对象就会有相同

48110

【小家Spring】细说Spring IOC容器自动装配(@Autowired),以及Spring4.0新特性之【依赖注入】源码级解析

Spring是怎么样实现控制反转、依赖注入(DI)~ Demo Show(自动装配讲解之前,先构造一个例子看看效果(效果很像RedisTemplate): // 准备一个带Bean @Getter...如果是数组或容器类型的话,Spring可以将所有与目标类型匹配bean实例都注入进去,不需要判断 获取数组或容器单个组件类型 调用findAutowireCandidates方法获取与组件类型匹配...属性,表示是否允许该bena注入到其他bean,默认为true 类型匹配,如果存在的话 Qualifier注解。...// 若都不匹配,就直接返回false了,基本步骤为: //1、descriptor里拿倒类型 //2、First, check factory method return type,...哪怕不同,也是同一个对象 毕竟Spring管理Bean,默认都是单例 Spring BootRedisTemplate和StringRedisTemplate注入问题

3.6K60

浅谈

有没有一种办法,让我们只写一遍算法实现,就可以支持所有类型数据?(generic)是C#提供一种机制,它可以提供这种形式代码重用,即“算法重用”。...大多数算法都封装在一个类型,CLR允许创建引用类型类型,以及接口和委托。所以CLR允许类或接口中定义方法。...类型安全,在编译时可以检测错误。 2. 代码更加清晰,不需要手动转型。 3. 更好性能,不进行装箱。 FCL 最明显应用就是集合类。...使用类型并指定类型实参时,实际是CLR定义一个新类型对象,新类型对象类型派生自那个类型派生。...当然,如果使用Node,是可以做到,但是会丧失编译时类型安全性,而且值类型会被装箱。所以,有没有更好办法?我们利用继承特点是可以做到。

1K30

【愚公系列】2023年04月 Java教学课程 136-Spring MVC框架Request请求详解

Spring MVC框架,可以使用@RequestParam注解来获取请求参数,使用@RequestHeader注解来获取请求头信息。...小节 请求POJO类型参数获取 POJO简单属性 POJO对象属性 POJO集合属性(存储简单数据) POJO集合属性(存储对象数据) 名称冲突问题 4.类型转换器 SpringMVC对接收数据进行自动类型转换...--4.set保障同类型转换器仅保留一个,去重规则以Converter为准--> <!...,实现Converter接口,接口中指定即为最终作用条件 //本例填写是String,Date,最终出现字符串转日期时,该类型转换器生效 public class MyDateConverter...implements Converter { //重写接口抽象方法,参数由决定 public Date convert(String source)

39650

Spring 注入 Bean 到 List Map

将注入Bean 放在List或者Map: /* * spring会自动将 DemoService 所有实现类bean注入到list集合 */ @Autowired private List demoServiceMap; Spring注入集合同时,会将集合实例填入集合,作为集合初始值。...这个过程源码 org.springframework.beans.factory.support.DefaultListableBeanFactory doResolveDependency 方法调用了...resolveMultipleBeans 方法: 如果是数组,则获取数组元素类型,查找匹配该类型所有bean,返回一个这些bean数组; 如果该类可赋给Collection,并且是一个接口,则获取集合元素类型...,查找匹配该类型所有bean,返回一个这些bean集合; 如果该类型是Map(注意是type == Map.class),且key是String类型,则获取Mapvalue类型,查找匹配该类型所有

2.6K20

【小家SpringSpring Boot中使用RedisTemplate优雅操作Redis,并且解决RedisTemplate注入失败问题

先理解依赖注入原理,再去读下文注入失败问题,很多问题都会迎刃而解~ Spring缓存主要有一个缓存接口(Cache)与缓存管理接口(CacheManager)。...想到RedisTemplateSpringBoot框架是自动配置,容器默认就是RedisTemplate实例。想到这里,就需要翻下官网文档,看看官网文档有没有什么说明。 ?...虽然类型都一样,但是不一样,强大Spring还是能够很好区分开。 那么实际开发,如果我们需要操作上面Person类型,怎么做呢?...建议:注入restTemplate时候不指定类型,而在在获取处理器时候,手动指定即可 @Autowired private RedisTemplate redisTemplate...restTemplate,而是获得处理器时候指定就好了。

6K30

6. 二十不惑,ObjectMapper使用也不再迷惑

应用及开发,ObjectMapper绝对是最常使用,也是你使用Jackson入口,本文就列列它那些使用场景。...擦除问题 例举出来三个read读方法,就应该觉得事情还没完,比如这个带case: @Test public void test5() throws JsonProcessingException...解决此问题之前,我们得先对Java擦除有所了解,至少知道如下两点结论: Java 在编译时会在字节码里指令集之外地方保留部分信息 接口、类、方法定义上所有、成员变量声明处都会被保留类型信息...---------- 1 本方案理论依据是:接口/类上类型不会被擦除。...对于擦除情况,解决思路是hold住类型,这样反序列化时候才不会抓瞎。但凡只要一抓瞎,Jackson就木有办法只能采用通用/默认类型去装载喽。

1.4K30
领券