最近翻出了两年前老吴让我写的一个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; } } }
相关推荐
这是动态代理的简单实例,方便学,入手.这个例子非常的简单哦!
JAVA AOP例子, 包括cglib, jsvassist, dynamicProxy
动态代理的代码例子,很好的入门案例。 理解SPRING的代理机制
<artifactId>dynamicproxy <version>1.0.0 接下来,让我们看一些实现动态代理的例子。 1.2 创建调用者 首先,让我们定义一个接口。 public interface EchoService { String echo(String message); } 通过使用运行时...
用Castl.Net中的DynamicProxy做的拦截器程序例子
在Asp.net(C#)平台下开发的Nhibernate + ajax + xml + mssql的例子,用到了Castle.DynamicProxy.dll、Iesi.Collections.dll、log4net.dll、Nullables.dll、NHibernate.dll、NHibernate.Caches.SysCache.dll等组件,...
13、实现接口之间的转换,即调用第一个接口会自动转换为第二个接口的方法。--com.cn21.invocation包. 14、java核心技术第二章源码--com.java7book.chapter2.dynamicproxy. 15、方法句柄的例子--invoke包。 16、方法...
如果您想对代理模式本身有一个概述,我可以推荐以下资源。 我们要达到什么目标? 这个项目诞生了,因为我不得不处理许多大型的老项目。 我唯一可以依靠的是纯JDK。 因此,我开始使用不同的设计模式,并发现代理对...
下面是使用 @SuppressWarnings 来取消 deprecation 警告的一个例子: public class Test { @Deprecated //在eclipse下运行的时候,方法名上会加一横线 public static void sayHello() { } } public class Test...
设置一个中间代理来控制访问原目标对象,以达到增强原对象的功能和简化访问方式。 静态代理 动态代理(JDK代理,借口代理) package basicKnowledge.dynamicProxy; import java.lang.reflect.InvocationHandler; ...
这是一个实验项目。 Scala.js 在 service worker 中使用网络代理, 例子 它适用于 ServiceWorker。 package mz import scala . scalajs . js import js . annotation . JSExport import js . Dynamic . global ...
保证一个类只有一个实例,并提供一个访问它的全局访问点 设计模式之 Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 new 一样频繁. 设计模式之 Builder 汽车由车轮 方向盘 发动机很多部件组成,同时,将这些...
CISCO 技术大集合 {适合你们的技术} 二、命令状态 1. router> 路由器处于用户命令状态,这时用户可以看路由器的连接状态...以下给出一个显示Cisco同步串口状态的例子. Router#show interface serial 0 Serial 0 is ...