1. <tt id="5hhch"><source id="5hhch"></source></tt>
    1. <xmp id="5hhch"></xmp>

  2. <xmp id="5hhch"><rt id="5hhch"></rt></xmp>

    <rp id="5hhch"></rp>
        <dfn id="5hhch"></dfn>

      1. JAVA認證基礎知識:基于反射機制的服務代理調用

        時間:2023-03-08 08:18:30 JAVA認證 我要投稿
        • 相關推薦

        JAVA認證基礎知識:基于反射機制的服務代理調用

          實現原理:通過傳遞服務bean的名稱、執行的方法及參數,通過反射機制進行調用返回。

        JAVA認證基礎知識:基于反射機制的服務代理調用

          優點:只需對外提供一個接口服務即可,只要容器中操作服務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 functionName, 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;

          }

          //獲取服務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");

          testservice 為spring中bean實例

          say 為testservice的業務方法

          helloword 為參數

          以上方式可以使用與遠程調用(如webservice等),對外為的代理調用接口。只需實現一個對外接口,調用服務內部多個業務服務。

        【JAVA認證基礎知識:基于反射機制的服務代理調用】相關文章:

        JAVA認證基礎知識:JavaNativeInterface學習小結06-02

        java調用cmd命令01-29

        Java的基礎知識07-27

        sun java認證報考指南08-26

        Java基礎知識詳解12-07

        Java語言的特點和實現機制08-13

        java認證考試試題及答案08-20

        sun認證考試:Java.io的使用05-29

        2016年Java認證考試題08-26

        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码

        1. <tt id="5hhch"><source id="5hhch"></source></tt>
          1. <xmp id="5hhch"></xmp>

        2. <xmp id="5hhch"><rt id="5hhch"></rt></xmp>

          <rp id="5hhch"></rp>
              <dfn id="5hhch"></dfn>