好久不寫東西,最近整理之前的東西時發現以前有一些寫好的東西,其實都是一些學習筆記或是對某個技術理解的一些感想,覺得很有意思,拿出來和大家分享一下。
這篇文章我們先來說一下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(); } } |