`
leonzhx
  • 浏览: 786018 次
  • 性别: 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

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

    DynamicProxy:一个简单实用的JDK动态代理演示

    本文将深入探讨JDK动态代理,并通过一个简单的实例来演示其用法。 动态代理主要由两个核心类组成:`java.lang.reflect.Proxy` 和 `java.lang.reflect.InvocationHandler`。`Proxy` 类是用于创建动态代理对象的工厂...

    proxy.rar java三种代理模式源码

    在"DynamicProxy"目录下的源码中,可以看到如何使用这些类和接口创建并操作动态代理的例子。 3. 接口代理(JDK动态代理): 接口代理是基于Java的反射机制实现的动态代理,适用于目标对象实现了接口的情况。在...

    javawebservice例子.pdf

    **Dynamic Proxy例子**: 1. 使用与DII相同的服务端程序`HelloClient`。 2. 定义一个接口`HelloClientInterface`,它扩展`java.rmi.Remote`并声明`getName`方法。 3. 在客户端代码`TestHelloClient.java`中,使用`...

    示例代码:java动态代理和cglib代理的简单例子

    本篇文章将深入探讨这两种代理机制,并通过一个简单的例子来展示它们的用法。 一、Java动态代理 Java动态代理基于Java的反射API,它在运行时创建一个实现了特定接口的代理类。这个代理类会拦截调用并执行额外的...

    JavaEE proxy简单代理示例

    以下是一个简单的例子: ```java // 接口 public interface Service { void execute(); } // 目标对象 public class RealService implements Service { @Override public void execute() { System.out....

    Castle AOP例子

    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....

    JDK动态代理proxy

    `Proxy` 类用于创建一个代理对象,而`InvocationHandler`接口定义了代理对象的方法调用处理逻辑。 ### 2. `InvocationHandler`接口 `InvocationHandler`接口只有一个方法 `invoke()`,它接收三个参数:代理对象、...

    java 代理(动态、静态)实例

    在这个例子中,`DynamicProxy`实现了`InvocationHandler`接口,并在`invoke`方法中处理目标方法的调用。`Proxy.newProxyInstance`方法用于创建动态代理对象。 总结,Java代理机制提供了一种灵活的方式来添加或扩展...

    反射实现 AOP 动态代理模式(Spring AOP 的实现 原理) - Java 例子 -

    在这个例子中,`DynamicProxy`实现了`InvocationHandler`接口,并在`invoke`方法中添加了前置和后置通知。`Proxy.newProxyInstance()`方法用于创建代理对象,传入目标对象的类加载器、目标对象实现的接口列表以及...

    静态代理和动态代理简单实现代码

    在动态代理中,我们创建了一个实现了 `InvocationHandler` 接口的 `DynamicProxy` 类。`invoke()` 方法是关键,它会在调用真实对象的方法之前和之后添加额外的逻辑。使用 `Proxy.newProxyInstance()` 可以生成一个...

    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); } 通过使用运行时...

    静态代理和动态代理的例子

    下面是一个简单的静态代理例子: ```java // 接口 public interface Service { void doSomething(); } // 被代理类 public class RealService implements Service { @Override public void doSomething() { ...

    JAVA设计模式之代理模式实例

    代理模式的核心思想是为一个对象创建一个代理对象,这个代理对象在客户端和目标对象之间起到中介的作用。它可以控制目标对象的访问,也可以在调用目标对象的方法前后添加额外的功能,如日志记录、权限控制等。代理...

    动态代理和工厂方法例子

    工厂方法是创建型设计模式之一,它的主要目标是定义一个创建对象的接口,但让子类决定实例化哪一个类。这样,工厂方法可以使一个类的实例化延迟到其子类中进行,增强了代码的灵活性和可扩展性。在实际应用中,我们...

    java中动态代理,springAop.pdf

    `DynamicProxy`类实现了`InvocationHandler`接口,并提供了一个`newclass()`方法,该方法接受一个实现了`Stu`接口的对象,然后返回一个代理对象。代理对象是通过`Proxy.newProxyInstance()`方法创建的,它需要类加载...

    webservice

    在提供的例子中,`HelloClient` 类是服务端程序,提供一个名为 `getName` 的方法。这个服务可以通过以下步骤部署和调用: - 编写服务端程序并将其保存为`.jws`文件。 - 将`.jws`文件放在Axis的Web应用目录下,如 `...

    dynamic-class.rar_自动创建类

    在这个例子中,`type()`函数接收三个参数:类名,基类列表(这里只有一个基类`object`),以及类的属性字典。这样就创建了一个名为`MyClass`的新类,具有`name`属性和`say_hello`方法。 而在Java中,动态类创建通常...

Global site tag (gtag.js) - Google Analytics