最近翻出了两年前老吴让我写的一个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; } } }
相关推荐
这是动态代理的简单实例,方便学,入手.这个例子非常的简单哦!
本文将深入探讨JDK动态代理,并通过一个简单的实例来演示其用法。 动态代理主要由两个核心类组成:`java.lang.reflect.Proxy` 和 `java.lang.reflect.InvocationHandler`。`Proxy` 类是用于创建动态代理对象的工厂...
在"DynamicProxy"目录下的源码中,可以看到如何使用这些类和接口创建并操作动态代理的例子。 3. 接口代理(JDK动态代理): 接口代理是基于Java的反射机制实现的动态代理,适用于目标对象实现了接口的情况。在...
**Dynamic Proxy例子**: 1. 使用与DII相同的服务端程序`HelloClient`。 2. 定义一个接口`HelloClientInterface`,它扩展`java.rmi.Remote`并声明`getName`方法。 3. 在客户端代码`TestHelloClient.java`中,使用`...
本篇文章将深入探讨这两种代理机制,并通过一个简单的例子来展示它们的用法。 一、Java动态代理 Java动态代理基于Java的反射API,它在运行时创建一个实现了特定接口的代理类。这个代理类会拦截调用并执行额外的...
以下是一个简单的例子: ```java // 接口 public interface Service { void execute(); } // 目标对象 public class RealService implements Service { @Override public void execute() { System.out....
1. 引入Castle.Core和Castle.DynamicProxy NuGet包。 2. 定义一个接口或类,这是你想要增强的行为。例如,你可能有一个`IService`接口,包含`DoSomething()`方法。 3. 创建一个代理类,继承自`IInterceptor`接口。这...
以下是一个简单的例子: ```java // 目标接口 public interface Service { void doSomething(); } // 目标对象 class RealService implements Service { @Override public void doSomething() { System.out....
`Proxy` 类用于创建一个代理对象,而`InvocationHandler`接口定义了代理对象的方法调用处理逻辑。 ### 2. `InvocationHandler`接口 `InvocationHandler`接口只有一个方法 `invoke()`,它接收三个参数:代理对象、...
在这个例子中,`DynamicProxy`实现了`InvocationHandler`接口,并在`invoke`方法中处理目标方法的调用。`Proxy.newProxyInstance`方法用于创建动态代理对象。 总结,Java代理机制提供了一种灵活的方式来添加或扩展...
在这个例子中,`DynamicProxy`实现了`InvocationHandler`接口,并在`invoke`方法中添加了前置和后置通知。`Proxy.newProxyInstance()`方法用于创建代理对象,传入目标对象的类加载器、目标对象实现的接口列表以及...
在动态代理中,我们创建了一个实现了 `InvocationHandler` 接口的 `DynamicProxy` 类。`invoke()` 方法是关键,它会在调用真实对象的方法之前和之后添加额外的逻辑。使用 `Proxy.newProxyInstance()` 可以生成一个...
<artifactId>dynamicproxy <version>1.0.0 接下来,让我们看一些实现动态代理的例子。 1.2 创建调用者 首先,让我们定义一个接口。 public interface EchoService { String echo(String message); } 通过使用运行时...
下面是一个简单的静态代理例子: ```java // 接口 public interface Service { void doSomething(); } // 被代理类 public class RealService implements Service { @Override public void doSomething() { ...
代理模式的核心思想是为一个对象创建一个代理对象,这个代理对象在客户端和目标对象之间起到中介的作用。它可以控制目标对象的访问,也可以在调用目标对象的方法前后添加额外的功能,如日志记录、权限控制等。代理...
工厂方法是创建型设计模式之一,它的主要目标是定义一个创建对象的接口,但让子类决定实例化哪一个类。这样,工厂方法可以使一个类的实例化延迟到其子类中进行,增强了代码的灵活性和可扩展性。在实际应用中,我们...
`DynamicProxy`类实现了`InvocationHandler`接口,并提供了一个`newclass()`方法,该方法接受一个实现了`Stu`接口的对象,然后返回一个代理对象。代理对象是通过`Proxy.newProxyInstance()`方法创建的,它需要类加载...
在提供的例子中,`HelloClient` 类是服务端程序,提供一个名为 `getName` 的方法。这个服务可以通过以下步骤部署和调用: - 编写服务端程序并将其保存为`.jws`文件。 - 将`.jws`文件放在Axis的Web应用目录下,如 `...
在这个例子中,`type()`函数接收三个参数:类名,基类列表(这里只有一个基类`object`),以及类的属性字典。这样就创建了一个名为`MyClass`的新类,具有`name`属性和`say_hello`方法。 而在Java中,动态类创建通常...