实现原理:通过传递服务bean的名称、执行的方法及参数,通过反射机制进行调用返回。
优点:只需对外提供一个接口服务即可,只要容器中操作服务bean,通过接口即可调用,增加服务bean无需增加对外接口。
代码如下:
接口类
- public interface ProxyService {
- /**
- * webservice调用代理
- * @param beanName bean或类名
- * @param functionName 调用的函数名
- * @param params 参数
- * @return
- * @throws Exception
- */
- Object proxy(String beanName, String functionName,String... params) throws Exception;
- }
实现类:
服务基于spring,为了方便获取服务bean,实现类实现spring的ApplicationContextAware接口
- @Service
- public class ProxyServiceImpl implements ProxyService ,ApplicationContextAware{
- protected final Logger logger = LoggerFactory.getLogger(getClass());
- @Resource
- private ApplicationContext applicationContext;
- @Override
- public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
- this.applicationContext = applicationContext;
- }
- /**
- * 通过代理执行业务方法,方法数据
- */
- @SuppressWarnings("rawtypes")
- @Override
- public Object proxy(String beanName, String functionName, String... params) throws ServiceException {
- //参数判断
- if(StringUtils.isEmpty(beanName)){
- throw new Exception("error: beanName is empty.");
- }
- if(StringUtils.isEmpty(functionName)){
- throw new Exception("error: functionName is empty.");
- }
- //获取服务bean
- Object bean = getBean(beanName);
- if(bean == null){
- throw new Exception("error: bean is not exist.");
- }
- if(params == null || params.length ==0){
- logger.warn("proxy params is empty.");
- }
- Method method = null;
- //处理无参数调用
- if(params == null || params.length ==0){
- try {
- //获取服务bean方法
- method = bean.getClass().getMethod(functionName);
- } catch (SecurityException e) {
- logger.error("proxy getMethod SecurityException:"+e.getMessage());
- e.printStackTrace();
- } catch (Exception e) {
- logger.error("proxy invoke IllegalArgumentException:"+e.getMessage());
- e.printStackTrace();
- throw new Exception("error: get method Exception:"+e.getMessage());
- }
- }else{
- //处理有参数调用
- //处理调用方法参数
- Class[] paraTypes = new Class[params.length];
- for (int i = 0; i < paraTypes.length; i++) {
- paraTypes[i] = String.class;
- }
- try {
- //获取服务bean方法
- method = bean.getClass().getMethod(functionName, paraTypes);
- }catch (Exception e) {
- logger.error("proxy invoke IllegalArgumentException:"+e.getMessage());
- e.printStackTrace();
- throw new Exception("error: get method Exception:"+e.getMessage());
- }
- }
- if(method == null ){
- throw new Exception("error: function is not exist.");
- }
- Object rs = null;
- try {
- //调用返回数据
- rs = method.invoke(bean,params);
- } catch (Exception e) {
- logger.error("proxy invoke IllegalArgumentException:"+e.getMessage());
- e.printStackTrace();
- throw new Exception("error: invoke method Exception:"+e.getMessage());
- }
- return rs;
- }
- /**
- * 获取bean对象
- * @param beanName
- * @return
- */
- private Object getBean(String beanName){
- Object bean = null;
- bean = applicationContext.getBean(beanName);
- if(bean == null){
- try {
- Class<?> classe = Class.forName(beanName);
- bean = classe.newInstance();
- } catch (InstantiationException e) {
- logger.error("getBean InstantiationException:"+e.getMessage());
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- logger.error("getBean IllegalAccessException:"+e.getMessage());
- e.printStackTrace();
- }catch ( ClassNotFoundException e) {
- logger.error("getBean ClassNotFoundException:"+e.getMessage());
- e.printStackTrace();
- }
- }
- logger.debug("getBean(),beanName:"+beanName);
- return bean;
- }
- }
调用方式如下:
proxyService.proxy("testservice","say","helloword");
testservice 为spring中bean实例
say 为testservice的业务方法
helloword 为参数
以上方式可以使用与远程调用(如webservice等),对外为的代理调用接口。只需实现一个对外接口,调用服务内部多个业务服务。
转载自:http://blog.csdn.net/zhu_tianwei/article/details/18082045,如涉及版权问题,请联系我。本人即刻删除该转载贴
相关推荐
3. **反射机制**:在AOP动态代理中,反射机制扮演着重要角色。通过反射,我们可以动态获取类的信息,包括类的字段、方法等,并能够在运行时动态地调用方法。在创建代理对象和处理方法调用时,都会用到反射。 4. **...
动态代理则是一种基于反射的机制,用于在运行时创建一个实现了指定接口的新类。这个新类能够代理原始对象,对方法调用进行拦截,执行额外的操作,如日志记录、事务管理、性能监控等。在Java中,有两种实现动态代理的...
Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息。这种动态类型的能力使得Java代码能够处理未知或未提前定义的对象,增强了程序的灵活性和可扩展性。在Java中...
在Java中,动态代理是一种利用反射机制实现的编程技术,主要用于在运行时创建一个代理类,这个代理类可以代表并增强原始目标类的行为。Java的动态代理主要通过`java.lang.reflect.Proxy`和`java.lang.reflect....
动态代理则是基于反射机制实现的一种高级功能,可以为已存在的类创建代理对象,实现在运行时对方法调用的拦截和增强。 ### Java反射机制 1. **Class类**: 反射的核心是`java.lang.Class`类,它代表了运行时的类...
在Java中,基于动态代理和反射机制实现ORM可以提高代码的可维护性和灵活性。本篇文章将深入探讨如何在Java环境下,结合MySQL数据库,利用动态代理和反射技术来实现简单的ORM框架。 首先,我们需要了解动态代理和...
1. 动态代理原理:动态代理是基于Java反射机制,通过在运行时动态生成实现了特定接口的代理类,以此来实现对原对象的代理。 2. java.lang.reflect.Proxy类:Proxy类提供了创建动态代理类和代理对象的工厂方法。通过...
- **动态代理**:Java中的动态代理机制基于反射,可以创建一个代理类来拦截并处理方法调用,例如用于AOP(面向切面编程)。 - **插件系统**:在运行时加载未知的插件类,实现模块化和扩展性。 - **测试工具**:单元...
此外,LEAD/LEAD++、OpenC++、MetaXa和OpenJava等编程语言都是基于反射机制构建的。 反射不仅限于编程语言领域,近年来也被广泛应用于视窗系统、操作系统以及文件系统中。尽管“反射”一词在计算机科学中有着全新的...
### Java反射机制详解 #### 一、什么是Java的反射机制 Java反射机制是Java语言的一种重要特性,使得Java成为了一种动态性很强的语言。通过反射,可以在程序运行时获取类的信息,包括类名、父类、接口、字段、方法...
- **基础**: 动态代理依赖于反射机制,通过反射获取目标对象的接口信息和方法调用。 - **增强功能**: 反射提供基础的类和方法操作能力,而动态代理则在此基础上增加了运行时的代码增强功能。 - **组合使用**: 在...
- 动态代理:Java的动态代理机制(`java.lang.reflect.Proxy`)基于反射实现,用于在运行时创建一个实现了指定接口的新类。 8. **注意事项**: - 性能:反射操作比直接的Java代码要慢,因为它涉及更多的运行时...
Java中的反射机制是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法等对象。在Java 1.5引入的反射API使得开发者可以在编译期未知的情况下,动态地获取类的信息并执行相关操作。以下将详细介绍...
反射机制是基于Java的类加载机制实现的,当类被加载到JVM后,Java的反射API可以获取到类的所有信息,包括类名、接口、构造器、字段、方法等。通过`Class`对象,我们可以获取到类的实例,进而进行各种操作。 **2. ...
Java动态代理则是基于反射机制实现的一种功能,它允许我们在运行时动态创建代理对象,这些代理对象能够代替原始对象执行特定的任务,比如拦截方法调用、事务管理、权限控制等。动态代理通常有两种实现方式:一是使用...