`

基于反射机制的服务代理调用

 
阅读更多

实现原理:通过传递服务bean的名称、执行的方法及参数,通过反射机制进行调用返回。

优点:只需对外提供一个接口服务即可,只要容器中操作服务bean,通过接口即可调用,增加服务bean无需增加对外接口。

代码如下:

接口类

 

[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. public interface ProxyService {  
  2.     /** 
  3.      * webservice调用代理 
  4.      * @param beanName  bean或类名 
  5.      * @param functionName 调用的函数名 
  6.      * @param params 参数 
  7.      * @return 
  8.      * @throws Exception 
  9.      */  
  10.     Object proxy(String beanName, String functionName,String... params) throws Exception;  
  11. }  

实现类:

 

服务基于spring,为了方便获取服务bean,实现类实现spring的ApplicationContextAware接口

[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. @Service  
  2. public class ProxyServiceImpl implements ProxyService ,ApplicationContextAware{  
  3.   
  4.     protected final Logger logger = LoggerFactory.getLogger(getClass());  
  5.       
  6.     @Resource  
  7.     private ApplicationContext applicationContext;  
  8.   
  9.     @Override  
  10.     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {  
  11.         this.applicationContext = applicationContext;  
  12.     }  
  13.       
  14.     /** 
  15.      * 通过代理执行业务方法,方法数据 
  16.      */  
  17.     @SuppressWarnings("rawtypes")  
  18.     @Override  
  19.     public Object proxy(String beanName, String functionName, String... params) throws ServiceException {  
  20.   
  21.          //参数判断  
  22.          if(StringUtils.isEmpty(beanName)){  
  23.              throw new Exception("error: beanName is empty.");  
  24.          }  
  25.          if(StringUtils.isEmpty(functionName)){  
  26.              throw new Exception("error: functionName is empty.");  
  27.          }  
  28.          //获取服务bean  
  29.          Object bean = getBean(beanName);  
  30.          if(bean == null){  
  31.              throw new Exception("error: bean is not exist.");  
  32.          }  
  33.         if(params == null || params.length ==0){  
  34.             logger.warn("proxy  params is empty.");  
  35.         }  
  36.           
  37.         Method method = null;  
  38.         //处理无参数调用  
  39.         if(params == null || params.length ==0){  
  40.              try {  
  41.                 //获取服务bean方法  
  42.                 method = bean.getClass().getMethod(functionName);  
  43.             } catch (SecurityException e) {  
  44.                 logger.error("proxy getMethod SecurityException:"+e.getMessage());  
  45.                 e.printStackTrace();  
  46.             } catch (Exception e) {  
  47.                 logger.error("proxy invoke IllegalArgumentException:"+e.getMessage());  
  48.                 e.printStackTrace();  
  49.                 throw new Exception("error: get method Exception:"+e.getMessage());  
  50.             }   
  51.         }else{  
  52.               //处理有参数调用  
  53.               //处理调用方法参数  
  54.               Class[] paraTypes = new Class[params.length];  
  55.               for (int i = 0; i < paraTypes.length; i++) {  
  56.                 paraTypes[i] = String.class;  
  57.               }  
  58.             try {  
  59.                 //获取服务bean方法  
  60.                 method = bean.getClass().getMethod(functionName, paraTypes);  
  61.             }catch (Exception e) {  
  62.                 logger.error("proxy invoke IllegalArgumentException:"+e.getMessage());  
  63.                 e.printStackTrace();  
  64.                 throw new Exception("error: get method Exception:"+e.getMessage());  
  65.             }   
  66.         }  
  67.         if(method == null ){  
  68.             throw new Exception("error: function is not exist.");  
  69.         }  
  70.            
  71.          Object rs = null;  
  72.         try {  
  73.             //调用返回数据  
  74.             rs = method.invoke(bean,params);  
  75.         } catch (Exception e) {  
  76.             logger.error("proxy invoke IllegalArgumentException:"+e.getMessage());  
  77.             e.printStackTrace();  
  78.             throw new Exception("error: invoke method Exception:"+e.getMessage());  
  79.               
  80.         }   
  81.         return rs;  
  82.     }  
  83.       
  84.     /** 
  85.      * 获取bean对象 
  86.      * @param beanName 
  87.      * @return 
  88.      */  
  89.     private Object getBean(String beanName){  
  90.         Object bean = null;  
  91.         bean = applicationContext.getBean(beanName);  
  92.         if(bean == null){  
  93.             try {  
  94.                 Class<?> classe = Class.forName(beanName);  
  95.                 bean = classe.newInstance();  
  96.             } catch (InstantiationException e) {  
  97.                 logger.error("getBean InstantiationException:"+e.getMessage());  
  98.                 e.printStackTrace();  
  99.             } catch (IllegalAccessException e) {  
  100.                 logger.error("getBean IllegalAccessException:"+e.getMessage());  
  101.                 e.printStackTrace();  
  102.             }catch ( ClassNotFoundException e) {  
  103.                 logger.error("getBean ClassNotFoundException:"+e.getMessage());  
  104.                 e.printStackTrace();  
  105.             }  
  106.         }  
  107.         logger.debug("getBean(),beanName:"+beanName);  
  108.         return bean;  
  109.     }  
  110.   
  111. }  

 

调用方式如下:

proxyService.proxy("testservice","say","helloword");
testservice 为spring中bean实例
say 为testservice的业务方法
helloword 为参数

以上方式可以使用与远程调用(如webservice等),对外为的代理调用接口。只需实现一个对外接口,调用服务内部多个业务服务。

转载自:http://blog.csdn.net/zhu_tianwei/article/details/18082045,如涉及版权问题,请联系我。本人即刻删除该转载贴

分享到:
评论

相关推荐

    J2EE应用开发详解

    37 3.5 动态代理 39 3.6 反射机制在Hibernate中的应用 42 3.7 小结 46 第4章 Servlet技术 47 4.1 Servlet简介 47 4.1.1 Servlet的特点 47 4.1.2 Servlet的优势 48 4.1.3 Servlet的工作过程 49 4.1.4 Servlet的生命...

    疯狂JAVA讲义

    1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6 1.3.2 Java程序的运行机制和JVM 6 1.4 开发Java的准备 7 1.4.1 安装JDK 8 学生提问:不是说JVM是运行Java程序的虚拟机吗?那JRE和JVM的关系是怎样的呢? 8 ...

    蚂蚁云客服机器人面试答案.docx

    依赖注入的思想是通过反射机制实现的,在实例化一个类时,它通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中。 总而言之,在传统的对象创建方式中,通常由调用者来创建被调用者的实例,而在Spring...

    java api最新7.0

    org.ietf.jgss 此包提供一个框架,该框架允许应用程序开发人员通过利用统一的 API 使用一些来自各种基础安全机制(如 Kerberos)的安全服务,如验证、数据完整性和和数据机密性。 org.omg.CORBA 提供 OMG CORBA API ...

    Spring.3.x企业应用开发实战(完整版).part2

    3.2.3 Java反射机制 3.3 资源访问利器 3.3.1 资源抽象接口 3.3.2 资源加载 3.4 BeanFactory和ApplicationContext 3.4.1 BeanFactory介绍 3.4.2 ApplicationContext介绍 3.4.3 父子容器 3.5 Bean的生命周期 3.5.1 ...

    Spring3.x企业应用开发实战(完整版) part1

    3.2.3 Java反射机制 3.3 资源访问利器 3.3.1 资源抽象接口 3.3.2 资源加载 3.4 BeanFactory和ApplicationContext 3.4.1 BeanFactory介绍 3.4.2 ApplicationContext介绍 3.4.3 父子容器 3.5 Bean的生命周期 3.5.1 ...

    windowsnt 技术内幕

    4.0 Windows NT网络协议简介 MUP简介 Multiple Provider Router简介 理解传输驱动动器接口(TDI) 理解文件系统驱动器 理解分布式处理 理解进行进程间通信机制 访问文件和打印资源 分布式文件和打印资源 分布式文件...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    20.2 异常处理机制 20.2.1 try块 20.2.2 catch块 20.2.3 finally块 20.3 System.Exception类 20.4 FCL定义的异常类 20.5 抛出异常 20.6 定义自己的异常类 20.7 用可靠性换取开发效率 20.8 指导原则和最佳...

    CLR.via.C#.(中文第3版)(自制详细书签)

    CLR.via.C#.(中文第3版)(自制详细书签)Part2 CLR via C#(第3版) Jeffrey Richter 著 周靖 译 ...27.11 基于事件的异步模式 27.11.1 将EAP转换为Task 27.11.2 APM和EAP的对比 27.12 编程模型的泥沼...

    asp.net知识库

    通过反射调用類的方法,屬性,字段,索引器(2種方法) ASP.NET: State Server Gems 完整的动态加载/卸载程序集的解决方案 从NUnit中理解.NET自定义属性的应用(转载) 如何在.NET中实现脚本引擎 (CodeDom篇) .NET的插件...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    20.2 异常处理机制 20.2.1 try块 20.2.2 catch块 20.2.3 finally块 20.3 System.Exception类 20.4 FCL定义的异常类 20.5 抛出异常 20.6 定义自己的异常类 20.7 用可靠性换取开发效率 20.8 指导原则和最佳...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    20.2 异常处理机制 20.2.1 try块 20.2.2 catch块 20.2.3 finally块 20.3 System.Exception类 20.4 FCL定义的异常类 20.5 抛出异常 20.6 定义自己的异常类 20.7 用可靠性换取开发效率 20.8 指导原则和最佳...

    .NET之美:.NET关键技术深入分析

    目录 第一部分C#语言基础 第1章C#类型基础 1.1值类型和引用类型 1.1.1值类型 1.1.2引用类型 1.1.3简单类型 1.1.4装箱和拆箱 ...第15章 .NET中的反射 第16章 多线程 第17章 对象生存期与垃圾收集

    JAVA_API1.6文档(中文)

    java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供...

    JAVA 范例大全 光盘 资源

    第9章 Java异常处理与反射机制 183 实例73 运用throws、throw、try与catch 183 实例74 throws声明异常的实例 185 实例75 自定义异常类 187 实例76 使用finally避免资源漏洞 189 实例77 反射机制 191 第10章 I/...

    Spring.net框架

    t.InvokeMember(prop.propertyName, ........BindingFlags.SetProperty, null, o, new Object[] {p})利用反射机制对创建出来的对象设置属性值。 我们的Factory就是利用这种方式根据配置文件动态加载程序集,动态创建...

    [Java参考文档].JDK_API 1.6

    org.ietf.jgss 此包提供一个框架,该框架允许应用程序开发人员通过利用统一的 API 使用一些来自各种基础安全机制(如 Kerberos)的安全服务,如验证、数据完整性和和数据机密性。 org.omg.CORBA 提供 OMG CORBA API ...

    python入门到高级全栈工程师培训 第3期 附课件代码

    07 recv与recvfrom的区别及基于udp实现ntp服务 08 基于tcp实现远程执行命令 09 基于tcp实现远程执行命令测试结果 10 粘包现象 11 粘包解决方法 第31章 01 上节课复习 02 socketserver实现并发 03 socketserver模块...

    Java 1.6 API 中文 New

    org.ietf.jgss 此包提供一个框架,该框架允许应用程序开发人员通过利用统一的 API 使用一些来自各种基础安全机制(如 Kerberos)的安全服务,如验证、数据完整性和和数据机密性。 org.omg.CORBA 提供 OMG CORBA API ...

    JavaAPI1.6中文chm文档 part1

    java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供...

Global site tag (gtag.js) - Google Analytics