`

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

 
阅读更多

实现原理:通过传递服务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,如涉及版权问题,请联系我。本人即刻删除该转载贴

分享到:
评论

相关推荐

    AOP动态代理(反射机制)

    3. **反射机制**:在AOP动态代理中,反射机制扮演着重要角色。通过反射,我们可以动态获取类的信息,包括类的字段、方法等,并能够在运行时动态地调用方法。在创建代理对象和处理方法调用时,都会用到反射。 4. **...

    JAVA的反射机制与动态代理

    动态代理则是一种基于反射的机制,用于在运行时创建一个实现了指定接口的新类。这个新类能够代理原始对象,对方法调用进行拦截,执行额外的操作,如日志记录、事务管理、性能监控等。在Java中,有两种实现动态代理的...

    java反射机制,调用私有方法

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息。这种动态类型的能力使得Java代码能够处理未知或未提前定义的对象,增强了程序的灵活性和可扩展性。在Java中...

    Java反射机制与动态代理

    在Java中,动态代理是一种利用反射机制实现的编程技术,主要用于在运行时创建一个代理类,这个代理类可以代表并增强原始目标类的行为。Java的动态代理主要通过`java.lang.reflect.Proxy`和`java.lang.reflect....

    java反射机制与动态代理

    动态代理则是基于反射机制实现的一种高级功能,可以为已存在的类创建代理对象,实现在运行时对方法调用的拦截和增强。 ### Java反射机制 1. **Class类**: 反射的核心是`java.lang.Class`类,它代表了运行时的类...

    基于Java动态代理和反射机制实现ORM

    在Java中,基于动态代理和反射机制实现ORM可以提高代码的可维护性和灵活性。本篇文章将深入探讨如何在Java环境下,结合MySQL数据库,利用动态代理和反射技术来实现简单的ORM框架。 首先,我们需要了解动态代理和...

    JAVA反射机制与动态代理

    1. 动态代理原理:动态代理是基于Java反射机制,通过在运行时动态生成实现了特定接口的代理类,以此来实现对原对象的代理。 2. java.lang.reflect.Proxy类:Proxy类提供了创建动态代理类和代理对象的工厂方法。通过...

    JAVA 反射机制与动态代理ppt

    - **动态代理**:Java中的动态代理机制基于反射,可以创建一个代理类来拦截并处理方法调用,例如用于AOP(面向切面编程)。 - **插件系统**:在运行时加载未知的插件类,实现模块化和扩展性。 - **测试工具**:单元...

    Java中的反射机制

    此外,LEAD/LEAD++、OpenC++、MetaXa和OpenJava等编程语言都是基于反射机制构建的。 反射不仅限于编程语言领域,近年来也被广泛应用于视窗系统、操作系统以及文件系统中。尽管“反射”一词在计算机科学中有着全新的...

    Java反射机制

    ### Java反射机制详解 #### 一、什么是Java的反射机制 Java反射机制是Java语言的一种重要特性,使得Java成为了一种动态性很强的语言。通过反射,可以在程序运行时获取类的信息,包括类名、父类、接口、字段、方法...

    JAVA反射机制与动态代理续一.rar

    - **基础**: 动态代理依赖于反射机制,通过反射获取目标对象的接口信息和方法调用。 - **增强功能**: 反射提供基础的类和方法操作能力,而动态代理则在此基础上增加了运行时的代码增强功能。 - **组合使用**: 在...

    Java反射机制学习(二)

    - 动态代理:Java的动态代理机制(`java.lang.reflect.Proxy`)基于反射实现,用于在运行时创建一个实现了指定接口的新类。 8. **注意事项**: - 性能:反射操作比直接的Java代码要慢,因为它涉及更多的运行时...

    类的反射机制您的网络连接,请

    Java中的反射机制是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法等对象。在Java 1.5引入的反射API使得开发者可以在编译期未知的情况下,动态地获取类的信息并执行相关操作。以下将详细介绍...

    java反射机制文档

    反射机制是基于Java的类加载机制实现的,当类被加载到JVM后,Java的反射API可以获取到类的所有信息,包括类名、接口、构造器、字段、方法等。通过`Class`对象,我们可以获取到类的实例,进而进行各种操作。 **2. ...

    JAVA的反射机制与动态代理.pdf

    Java动态代理则是基于反射机制实现的一种功能,它允许我们在运行时动态创建代理对象,这些代理对象能够代替原始对象执行特定的任务,比如拦截方法调用、事务管理、权限控制等。动态代理通常有两种实现方式:一是使用...

Global site tag (gtag.js) - Google Analytics