Java 找不到获取Springbean方法参数的参数化类型的方法

Java 找不到获取Springbean方法参数的参数化类型的方法,java,spring,spring-boot,Java,Spring,Spring Boot,我需要能够在Springbean上找到方法参数的参数化类型 我使用的是SpringBoot2.0.1 我有一个SpringBean,看起来如下所示: 公共类MyBean{ 公共void doFoo(列表参数){…} } 我需要能够找到param参数上的参数化类型。通常我可以这样做: MyBean MyBean=getMyBean(); ParameteredType pt=(ParameteredType)myBean .getClass() .getMethod(“doFoo”,List.c

我需要能够在Springbean上找到方法参数的参数化类型

我使用的是SpringBoot2.0.1

我有一个SpringBean,看起来如下所示:

公共类MyBean{
公共void doFoo(列表参数){…}
}
我需要能够找到
param
参数上的参数化类型。通常我可以这样做:

MyBean MyBean=getMyBean();
ParameteredType pt=(ParameteredType)myBean
.getClass()
.getMethod(“doFoo”,List.class)
.getGenericParameterTypes()[0];
类listOfX=(类)pt.getActualTypeArguments()[0];
但是,当对Springbean执行此操作时,
getGenericParameterTypes()
方法总是返回
Class
对象数组,而不是
Type
对象数组

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


如果只提供一个Springbean实例,我可以利用一些想法来了解如何获得关于这个参数的参数化信息。我一直在努力寻找从
MyBean$$EnhancerBySpringCGLIB$$xxxxxxxx
访问
MyBean.class
的方法,从那里我可以找到我可以使用反射的真正方法。但我还没有找到解决办法。我试图不惜一切代价避免使用
Class.forName(…)

在我的特殊情况下,下面的代码似乎可以找到底层的真实类:

if(myBean instanceof org.springframework.aop.framework.Advised){
类realClass=((建议)r).getTargetClass();
}

从那里我可以使用标准反射。但是我不确定这个解决方案有多干净,或者我是否能期望所有SpringBean实现
建议的
接口。

在我的特定情况下,下面的代码似乎可以找到底层的真实类:

if(myBean instanceof org.springframework.aop.framework.Advised){
类realClass=((建议)r).getTargetClass();
}

从那里我可以使用标准反射。但是我不确定这个解决方案有多干净,或者我是否能期望所有Springbean实现
建议的
接口。

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

例如:

@组件
公共类参数化BeanFactoryPostProcessor实现BeanPostProcessor{
@凌驾
公共对象后处理BeforeInitialization(对象bean、字符串beanName)抛出BeanException{
//bean是你真正的类
试一试{
如果(“myBean”。等于(beanName)){
ParameteredType pt=(ParameteredType)bean
.getClass()
.getMethod(“doFoo”,List.class)
.getGenericParameterTypes()[0];
类listOfX=(类)pt.getActualTypeArguments()[0];
System.out.println(listOfX);//类java.lang.Integer
}
}捕获(无此方法例外){
e、 printStackTrace();
}
返回豆;
}
@凌驾
公共对象后处理初始化后(对象bean、字符串beanName)抛出BeansException{
//bean是代理对象
返回豆;
}
}

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

例如:

@组件
公共类参数化BeanFactoryPostProcessor实现BeanPostProcessor{
@凌驾
公共对象后处理BeforeInitialization(对象bean、字符串beanName)抛出BeanException{
//bean是你真正的类
试一试{
如果(“myBean”。等于(beanName)){
ParameteredType pt=(ParameteredType)bean
.getClass()
.getMethod(“doFoo”,List.class)
.getGenericParameterTypes()[0];
类listOfX=(类)pt.getActualTypeArguments()[0];
System.out.println(listOfX);//类java.lang.Integer
}
}捕获(无此方法例外){
e、 printStackTrace();
}
返回豆;
}
@凌驾
公共对象后处理初始化后(对象bean、字符串beanName)抛出BeansException{
//bean是代理对象
返回豆;
}
}