`
leonzhx
  • 浏览: 768302 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一个 Dynamic Proxy 的例子

    博客分类:
  • Java
阅读更多

最近翻出了两年前老吴让我写的一个MockFacotry , 需要是传入一个Mock的object ,代理一系列的接口,只要mock object实现其中的方法就将调用代理给mock object不然就抛 UnsupportedOperationException。现将代码记录如下:

 

  import java.lang.reflect.InvocationHandler;
  import java.lang.reflect.InvocationTargetException;
  import java.lang.reflect.Method;
  import java.lang.reflect.Proxy;
  import java.util.HashMap;
  import java.util.Map;
  
  public class MockFactory {
     public static Object createInstance(Object implementation, Class<?>... interfaces) {
        return Proxy.newProxyInstance(MockFactory.class.getClassLoader(), interfaces, new Handler(implementation));
     }
  
     static class Handler implements InvocationHandler {
        private Map<MethodKey, MethodInvoker> m_methods;
  
        private Object m_instance;
  
        public Handler(Object instance) {
           m_instance = instance;
           m_methods = new HashMap<MethodKey, MethodInvoker>();
  
           for (Method method : instance.getClass().getMethods()) {
              m_methods.put(new MethodKey(method), new MethodInvoker(method));
           }
        }
  
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
           MethodInvoker invoker = m_methods.get(new MethodKey(method));
  
           if (invoker != null) {
              return invoker.invoke(m_instance, args);
           } else {
              throw new UnsupportedOperationException(method + " is NOT implemented in " + m_instance.getClass());
           }
        }
     }
  
     static class MethodInvoker {
        private Method m_method;
  
        public MethodInvoker(Method method) {
           m_method = method;
        }
  
        public Object invoke(Object invokerInstance, Object... args) throws Throwable {
           try {
              if (!m_method.isAccessible()) {
                 m_method.setAccessible(true);
              }
  
              return m_method.invoke(invokerInstance, args);
           } catch (InvocationTargetException e) {
              throw e.getCause();
           } catch (Exception e) {
              throw e;
           }
        }
     }
  
     static class MethodKey {
        private Method m_method;
  
        public MethodKey(Method method) {
           m_method = method;
        }
  
        @Override
        public boolean equals(Object obj) {
           if (obj instanceof MethodKey) {
              MethodKey other = (MethodKey) obj;
  
              if ((m_method.getName().equals(other.m_method.getName()))) {
                 if (m_method.getReturnType().equals(other.m_method.getReturnType())) {
                    Class<?>[] params1 = m_method.getParameterTypes();
                    Class<?>[] params2 = other.m_method.getParameterTypes();
  
                    if (params1.length == params2.length) {
                       for (int i = 0; i < params1.length; i++) {
                          if (params1[i] != params2[i]) {
                             return false;
                          }
                       }
  
                       return true;
                    }
                 }
              }
           }
  
           return false;
        }
  
        @Override
        public int hashCode() {
           int hashcode = m_method.getName().hashCode();
  
           hashcode = hashcode * 31 + m_method.getReturnType().hashCode();
           hashcode = hashcode * 31 + m_method.getParameterTypes().length;
  
           return hashcode;
        }
     }
  }

 

分享到:
评论

相关推荐

    DynamicProxy

    这是动态代理的简单实例,方便学,入手.这个例子非常的简单哦!

    Aop.rar_aop_java aop 例 proxy

    JAVA AOP例子, 包括cglib, jsvassist, dynamicProxy

    dt.zip_spring_www.dynamic-proxy.c

    动态代理的代码例子,很好的入门案例。 理解SPRING的代理机制

    java6string源码-dynamic-proxy:利用ASM、CGLIB、ByteBuddy、Javassist和JDKDynamicP

    &lt;artifactId&gt;dynamicproxy &lt;version&gt;1.0.0 接下来,让我们看一些实现动态代理的例子。 1.2 创建调用者 首先,让我们定义一个接口。 public interface EchoService { String echo(String message); } 通过使用运行时...

    .Net动态代理AOP拦截

    用Castl.Net中的DynamicProxy做的拦截器程序例子

    NHibernate学习例子

    在Asp.net(C#)平台下开发的Nhibernate + ajax + xml + mssql的例子,用到了Castle.DynamicProxy.dll、Iesi.Collections.dll、log4net.dll、Nullables.dll、NHibernate.dll、NHibernate.Caches.SysCache.dll等组件,...

    java7源码-test1:测试1

    13、实现接口之间的转换,即调用第一个接口会自动转换为第二个接口的方法。--com.cn21.invocation包. 14、java核心技术第二章源码--com.java7book.chapter2.dynamicproxy. 15、方法句柄的例子--invoke包。 16、方法...

    proxybuilder

    如果您想对代理模式本身有一个概述,我可以推荐以下资源。 我们要达到什么目标? 这个项目诞生了,因为我不得不处理许多大型的老项目。 我唯一可以依靠的是纯JDK。 因此,我开始使用不同的设计模式,并发现代理对...

    Java 高级特性.doc

    下面是使用 @SuppressWarnings 来取消 deprecation 警告的一个例子: public class Test { @Deprecated //在eclipse下运行的时候,方法名上会加一横线 public static void sayHello() { } } public class Test...

    vs没报错leetcode报错-leetcode:leetcode

    设置一个中间代理来控制访问原目标对象,以达到增强原对象的功能和简化访问方式。 静态代理 动态代理(JDK代理,借口代理) package basicKnowledge.dynamicProxy; import java.lang.reflect.InvocationHandler; ...

    scala-js-in-service-worker

    这是一个实验项目。 Scala.js 在 service worker 中使用网络代理, 例子 它适用于 ServiceWorker。 package mz import scala . scalajs . js import js . annotation . JSExport import js . Dynamic . global ...

    二十三种设计模式【PDF版】

    保证一个类只有一个实例,并提供一个访问它的全局访问点 设计模式之 Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 new 一样频繁. 设计模式之 Builder 汽车由车轮 方向盘 发动机很多部件组成,同时,将这些...

    CISCO 技术大集合

    CISCO 技术大集合 {适合你们的技术} 二、命令状态 1. router&gt; 路由器处于用户命令状态,这时用户可以看路由器的连接状态...以下给出一个显示Cisco同步串口状态的例子. Router#show interface serial 0 Serial 0 is ...

Global site tag (gtag.js) - Google Analytics