1. 程式人生 > >java反射機制的業務應用場景-1

java反射機制的業務應用場景-1

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

       這篇文章我們先來說一下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();
  }
 }