java - 找不到获取 Spring bean 方法参数的参数化类型的方法

标签 java spring spring-boot

我需要能够找到 Spring bean 上方法参数的参数化类型。

我正在使用 Spring Boot 2.0.1。

我有一个 Spring bean,如下所示:

public class MyBean {
   public void doFoo(List<Integer> param) {...}
}

我需要能够找出 param 参数的参数化类型。通常我可以这样做:

MyBean myBean = getMyBean();

ParameterizedType pt = (ParameterizedType)myBean
   .getClass()
   .getMethod("doFoo", List.class)
   .getGenericParameterTypes()[0];

Class<?> listOfX = (Class<?>)pt.getActualTypeArguments()[0];

但是,当针对 Spring bean 执行此操作时,getGenericParameterTypes() 方法始终返回 Class 对象数组,而不是 Type 对象数组。

原因是 Spring 广泛使用 CGLIB 来提供类的运行时重新编译以支持 AOP。因此,我没有获取 MyBean 的实例,而是获取了 MyBean$$EnhancerBySpringCGLIB$$xxxxxxxx 的实例,并且“重新编译”的类丢失了所有泛型信息(显然是因为 CGLIB 是在泛型存在之前编写的,并且不再受到积极支持?)。

如果仅提供 Spring bean 实例,我可以使用一些想法来了解如何获取此参数的参数化信息。我一直在尝试寻找从 MyBean$$EnhancerBySpringCGLIB$$xxxxxxxx 访问 MyBean.class 的方法,并从那里能够找到我可以使用反射的真正方法。但我还没有找到解决办法。我试图不惜一切代价避免 Class.forName(...)

最佳答案

一种可能的解决方案是实现 BeanPostProcessor。 您可以在 bean 初始化之前访问底层类。

这里的例子:

@Component
public class ParametrizedBeanFactoryPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // bean is your actual class
        try {
            if ("myBean".equals(beanName)) {
                ParameterizedType pt = (ParameterizedType) bean
                        .getClass()
                        .getMethod("doFoo", List.class)
                        .getGenericParameterTypes()[0];

                Class<?> listOfX = (Class<?>) pt.getActualTypeArguments()[0];
                System.out.println(listOfX); //class java.lang.Integer
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // bean is proxy object
        return bean;
    }
}

关于java - 找不到获取 Spring bean 方法参数的参数化类型的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57812500/

相关文章:

java - 我是否需要通过 CDI 中的生产者进行所有对象实例化

java - 如何让 Jersey 使用 Dagger 依赖注入(inject)?

java - Spring - 如何将 JSP 表单中的值与数据库中的值进行比较? (服务+DAO)

java - 子实体元素不坚持使用 hibernate 和 spring data jpa 的一对多映射

java - Spring 网络流: Understanding generated JSP

java - Camunda 外部客户端 : TASK/CLIENT-02002 Exception while establishing connection for request

java - 我究竟做错了什么??

Java - 通过字符串获取类属性

java - UsernameNotFoundException 在 spring boot 中抛出 403

java - 带有自定义 AngularJS 登录页面的 Spring Boot 和安全性