基于反射机制的服务代理调用
发布时间:2020-12-16 23:52:39 所属栏目:安全 来源:网络整理
导读:实现原理:通过传递服务bean的名称、执行的方法及参数,通过反射机制进行调用返回。 优点:只需对外提供一个接口服务即可,只要容器中操作服务bean,通过接口即可调用,增加服务bean无需增加对外接口。 代码如下: 接口类 public interface ProxyService { /
实现原理:通过传递服务bean的名称、执行的方法及参数,通过反射机制进行调用返回。 优点:只需对外提供一个接口服务即可,只要容器中操作服务bean,通过接口即可调用,增加服务bean无需增加对外接口。 代码如下: 接口类 public interface ProxyService { /** * webservice调用代理 * @param beanName bean或类名 * @param functionName 调用的函数名 * @param params 参数 * @return * @throws Exception */ Object proxy(String beanName,String functionName,String... params) throws Exception; }实现类: 服务基于spring,为了方便获取服务bean,实现类实现spring的ApplicationContextAware接口 @Service public class ProxyServiceImpl implements ProxyService,ApplicationContextAware{ protected final Logger logger = LoggerFactory.getLogger(getClass()); @Resource private ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } /** * 通过代理执行业务方法,方法数据 */ @SuppressWarnings("rawtypes") @Override public Object proxy(String beanName,String... params) throws ServiceException { //参数判断 if(StringUtils.isEmpty(beanName)){ throw new Exception("error: beanName is empty."); } if(StringUtils.isEmpty(functionName)){ throw new Exception("error: functionName is empty."); } //获取服务bean Object bean = getBean(beanName); if(bean == null){ throw new Exception("error: bean is not exist."); } if(params == null || params.length ==0){ logger.warn("proxy params is empty."); } Method method = null; //处理无参数调用 if(params == null || params.length ==0){ try { //获取服务bean方法 method = bean.getClass().getMethod(functionName); } catch (SecurityException e) { logger.error("proxy getMethod SecurityException:"+e.getMessage()); e.printStackTrace(); } catch (Exception e) { logger.error("proxy invoke IllegalArgumentException:"+e.getMessage()); e.printStackTrace(); throw new Exception("error: get method Exception:"+e.getMessage()); } }else{ //处理有参数调用 //处理调用方法参数 Class[] paraTypes = new Class[params.length]; for (int i = 0; i < paraTypes.length; i++) { paraTypes[i] = String.class; } try { //获取服务bean方法 method = bean.getClass().getMethod(functionName,paraTypes); }catch (Exception e) { logger.error("proxy invoke IllegalArgumentException:"+e.getMessage()); e.printStackTrace(); throw new Exception("error: get method Exception:"+e.getMessage()); } } if(method == null ){ throw new Exception("error: function is not exist."); } Object rs = null; try { //调用返回数据 rs = method.invoke(bean,params); } catch (Exception e) { logger.error("proxy invoke IllegalArgumentException:"+e.getMessage()); e.printStackTrace(); throw new Exception("error: invoke method Exception:"+e.getMessage()); } return rs; } /** * 获取bean对象 * @param beanName * @return */ private Object getBean(String beanName){ Object bean = null; bean = applicationContext.getBean(beanName); if(bean == null){ try { Class<?> classe = Class.forName(beanName); bean = classe.newInstance(); } catch (InstantiationException e) { logger.error("getBean InstantiationException:"+e.getMessage()); e.printStackTrace(); } catch (IllegalAccessException e) { logger.error("getBean IllegalAccessException:"+e.getMessage()); e.printStackTrace(); }catch ( ClassNotFoundException e) { logger.error("getBean ClassNotFoundException:"+e.getMessage()); e.printStackTrace(); } } logger.debug("getBean(),beanName:"+beanName); return bean; } } 调用方式如下: proxyService.proxy("testservice","say","helloword"); 以上方式可以使用与远程调用(如webservice等),对外为的代理调用接口。只需实现一个对外接口,调用服务内部多个业务服务。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |