Java 找不到获取Springbean方法参数的参数化类型的方法
我需要能够在Springbean上找到方法参数的参数化类型 我使用的是SpringBoot2.0.1 我有一个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
公共类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是代理对象
返回豆;
}
}