java反射機制的業務應用情境-1

來源:互聯網
上載者:User

       好久不寫東西,最近整理之前的東西時發現以前有一些寫好的東西,其實都是一些學習筆記或是對某個技術理解的一些感想,覺得很有意思,拿出來和大家分享一下。

       這篇文章我們先來說一下java的反射機制,java的反射機制其實在1.2的時候就已經有了,那時我們還沒有機會使用呢。而且也未必有那樣的情境需要使用,前幾年遇到一個情境使用java的反射機制在適合不過了,所以就使用了一下,發現確實好使,於是就寫了一些學習的筆記。

       下面我們就聊一下java的反射機制吧。

        首先介紹一下java的反射機制,java反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態擷取的資訊以及動態調用對象的方法的功能稱為java語言的反射機制。

        下面我們來具體說一個應用情境:分布式WebService介面設計

                                                   需求:只發布一個介面方法,實現多個業務操作。

         看著這樣的設計需求,其實有很多種實現方式,其它的我就不一一評述了,我們只說一下使用java反射機制配和axis配置WebService的實現方式。

         設計思路:發布一個介面,該介面使用一個業務類實現,該業務類中有很多具體業務實現方法。

                           例如:儲存、擷取列表、修改、擷取某個對象實體。(分布式系統完全採用WebService通訊)

                           利用axis發布一個多參數的介面,一個參數是function,一個參數時para。其中function的值對應業務類中的方法名,para是該方法要使用的資料對象,採用json格式。

                            這樣WebService介面實作類別就可以輕鬆的通過反射機制選擇業務實作類別的某個方法來實現邏輯處理。

                            

 代碼實現:

                 axis配置多參數

<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
            xmlns:java="http://xml.apache.org/axis/wsdd/providers/java" >
 <globalConfiguration>
  <parameter name="adminPassword" value="admin"/>
  <parameter name="attachments.Directory" value="./attachments"/>
  <parameter name="attachments.implementation"
             value="org.apache.axis.attachments.AttachmentsImpl"/>
  <parameter name="sendXsiTypes" value="true"/>
  <parameter name="sendMultiRefs" value="true"/>
  <parameter name="sendXMLDeclaration" value="true"/>
  <parameter name="axis.sendMinimizedElements" value="true"/>
  <parameter name="disablePrettyXML" value="true" />
  <parameter name="dotNetSoapEncFix" value="true" />
  <parameter name="enableNamespacePrefixOptimization"
   value="false" />
  <requestFlow>
   <handler type="java:org.apache.axis.handlers.JWSHandler">
    <parameter name="scope" value="session"/>
   </handler>
   <handler type="java:org.apache.axis.handlers.JWSHandler">
    <parameter name="scope" value="request"/>
    <parameter name="extension" value=".jwr"/>
   </handler>
  </requestFlow>
 </globalConfiguration>
 
 
 
 <handler name="LocalResponder"
          type="java:org.apache.axis.transport.local.LocalResponder"/>
 <handler name="URLMapper"
          type="java:org.apache.axis.handlers.http.URLMapper"/>
 <handler name="Authenticate"
          type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
          
  
 
 <service name="UBSAService" type="" regenerateElement="true"
        provider="java:RPC" style="rpc" use="encoded" validate="true">
  <parameter name="scope" value="Request" regenerateElement="false"/>
  <parameter name="allowedMethods" value="operateActivite"/>
  <parameter name="className" value="com.test.interf.webservice.ServiceImpl"/>
 
  <operation name="operateActivite" qname="operNS:operateActivite" xmlns:operNS="operateActivite" returnType="rns:string"
            xmlns:rns="
http://www.w3.org/2001/XMLSchema">
            <parameter name="function" type="ns:string" xmlns:ns="
http://www.w3.org/2001/XMLSchema"/>
            <parameter name="para" type="ns:string" xmlns:ns="
http://www.w3.org/2001/XMLSchema"/>
  </operation>
 
 
 </service>


<transport name="http">
  <requestFlow>
   <handler type="URLMapper"/>
   <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
  </requestFlow>
   <parameter name="qs:list"
   value="org.apache.axis.transport.http.QSListHandler" />  
 <parameter name="qs:wsdl"
   value="org.apache.axis.transport.http.QSWSDLHandler" />
 <parameter name="qs.method"
   value="org.apache.axis.transport.http.QSMethodHandler" />
 
 </transport>
 <transport name="local">
  <responseFlow>
   <handler type="LocalResponder"/>
  </responseFlow>
 </transport>
</deployment>

        介面類代碼實現:

  logger.info("請求參數[function]:"+function);
  logger.info("請求參數[para]:"+para);
  String responseData = "";
  String result = "";
  UBSActiviteWebBusiness ubsActiviteWebBusiness = (UBSActiviteWebBusiness) CustomBeanFactory.getBean("ubsActiviteWebBusiness");
  
  WebResponseJosn res = new WebResponseJosn();
  try {
   
   Class<? extends UBSActiviteWebBusiness> ubsActivite = ubsActiviteWebBusiness.getClass();
   Method method = ubsActivite .getMethod(function, new Class[]{String.class});
   if(method!=null){
    result = (String) method.invoke(ubsActiviteWebBusiness, new Object[]{para});  
   }else{
    res.setCode("1");
    res.setMessage("未找到處理方法。");
    
   }
    
  } catch (SecurityException e) {
   e.printStackTrace();
   res.setCode("1");
   res.setMessage("運營平台處理錯誤[SecurityException]");
   
  }

 

  這樣的設計有以下幾個優點:

                                             1:介面靈活可配。

                                              2:判斷業務方法簡單高效,尤其是配置spring的依賴注入,完全可以高效的定位業務處理方法。

                                              3:代碼清晰簡潔。

 以上只是個人愚見歡迎大家批評指正。

 

註:WebService調用程式碼範例:

public static void main(String[] args) {
  
  String urlString = "http://127.0.0.1:8096/services/UBSAService?wsdl";
  String nameSpaceUri = urlString.substring(0, urlString.length() - 5);
  String xml ="{\"productId\":\"123333\",\"aaaa\":\"aaaaaiiii\"}";
  URL serviceWsdlUrl;
  Service service = new Service();
  Call call;
  try {
   serviceWsdlUrl = new URL(urlString);
   call = (Call) service.createCall();
   call.setTargetEndpointAddress(serviceWsdlUrl);
   call.setOperationName(new QName(nameSpaceUri, "operateActivite"));
   call.addParameter("function", XMLType.XSD_STRING, ParameterMode.IN);
   call.addParameter("para", XMLType.XSD_STRING, ParameterMode.IN);
   call.setReturnType(XMLType.XSD_STRING);
   String result = (String) call.invoke(new Object[] {"saveActivite",xml});
      System.out.println(result);
  } catch (ServiceException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (MalformedURLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  catch (RemoteException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.