使用举例:
public Object findpage(DeviceTypeClass cla,DataLogSearchDto entity, QueryRequest request) {
String name = getServiceName(cla);
Object [] params = new Object[]{entity,request};
return SpringContextUtil.invoke(name, "getPage", params);
}
上面代码解析:在这段Java代码中,它被用于调用查看日志的方法。具体来说,它使用反射调用了一个名为getPage的方法,该方法属于一个名为dataLogXxxServiceImpl的bean,其中Xxx是根据设备类型动态生成的。
这种方式的优点是可以动态地调用不同的方法,而不需要在代码中写死。这在一些需要动态调用的场景下非常有用,比如插件式的开发或者动态配置等。
工具类
@Configuration
public class SpringContextUtil implements ApplicationContextAware{
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
public static Object getBean(String name) throws BeansException{
return applicationContext.getBean(name);
}
public static <T> T getBean(String name,Class<T> c) throws BeansException{
return applicationContext.getBean(name, c);
}
/**
* 执行bean方法
* @param beanName
* @param methodName
* @param params
* @return
*/
public static Object invoke(String beanName,String methodName,Object[] params) {
Object bean = SpringContextUtil.getBean(beanName);
Method method = null;
List<Class<?>> cList = Lists.newArrayList();
for(Object param : params) {
cList.add(param.getClass());
}
try {
method = bean.getClass().getMethod(methodName, cList.toArray(new Class[0]));
} catch (Exception e) {
throw new AppException(e.toString());
}
try {
return method.invoke(bean, params);
} catch (Exception e) {
throw new AppException(e.toString());
}
}
}