java反射机制的业务应用场景-1

来源:互联网 发布:黑帽seo技术论坛 编辑:程序博客网 时间:2024/06/06 18:14

       好久不写东西,最近整理之前的东西时发现以前有一些写好的东西,其实都是一些学习笔记或是对某个技术理解的一些感想,觉得很有意思,拿出来和大家分享一下。

       这篇文章我们先来说一下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();
  }
 }

 

0 0
原创粉丝点击