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();
  }
 }

 

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

沉默andy

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值