`

动态代理一例

 
阅读更多

  在之前的一篇关于Decorator模式的Post中,曾经提到了动态代理(Dynamic Proxy)简化了Decorator模式的实现。作为例子的代码很容易理解,但这个简化的背后仍包含着很多值得去发掘的内容。
       首先我们来明确一下动态代理的定义:一个动态代理类在运行期implements一组interface,使得interface实现类的方法调用被分派至其他的类(另外的interface实现类或者任意的类)的方法。讲得更通俗一些,要了解动态代理,我们就要知道什么东西动态了,代理了什么?首先,一个Proxy代理了一组interface的方法。注意,代理的是interface,而不是Class,也不是abstract Class;其次,Proxy具有的型别由绑定的interface所决定的,动态就体现在此。也许看着这样的定义,还是会一头雾水,那么我们画幅图来看看吧。

dynamicProxy.gif

从图中,我们可以看到Dynamic Proxy并没有实现Resource这个接口,但是包含了Resource接口实现类的实例;在Dynamic Proxy的create方法中,通过调用Proxy.newProxyInstance创建一个Proxy,并将该Proxy与Resource接口绑定,最后将Proxy显式类型转换成Resource接口类型并返回,这样调用者就可以通过Proxy调用interface定义的方法了;由于Proxy与Resource接口绑定了,对Resource接口的方法调用,都会交由Proxy的invoke方法去处理。而invoke方法会根据不同的方法,或给以全新的实现,或直接将方法调用交给Proxy中包含的Resource接口实现类的实例去处理。综合上面所说的,作为一个Dynamic Proxy,它必须满足以下三个条件:
        1、实现了InvocationHandler接口,实现接口中定义的invoke方法;
        2、包含接口实现类的实例;
        3、通过Proxy.newProxyInstance方法实现Proxy与接口之间的绑定。
        以下代码给出了一个简单的Dynamic Proxy实现:

public interface Resource {
    
public void
 operationA();
    
public void
 operationB();
}

                                                

public class ConcreteResource implements Resource {
    
public void operationA() 
{
        System.
out.println("Operation A."
);
    }

    
public void operationB() {
        System.
out.println("Operation B."
);
    }

}

                                                

public class DynamicProxy implements InvocationHandler {
    
private
 Resource resource;

    
public DynamicProxy() 
{
        resource 
= new
 ConcreteResource();
    }


    
public Resource create() {
this.resource = new ConcreteResource();
return (Resource) Proxy.newProxyInstance
(resource.getClass().getClassLoader(), resource.getClass().getInterfaces(), this);

    }


    
public Object invoke(Object obj, Method method, Object[] args) {
        Object o 
= null
;
        
try 
{
            
if (method.getName().equals("operationA")) 
{
                System.
out.println("OperationA in Proxy"
);
            }
 else {
                o 
=
 method.invoke(obj, args);
            }

        }
 catch (Exception e) {
            e.printStackTrace();
        }

        
return o;
    }

}

                                             

public class Test {
    
public static void main(String[] args) 
{
        DynamicProxy proxy 
= new
 DynamicProxy();
        Resource resource 
=
 proxy.create();
        resource.operationA();
    }

}
                                                           

分享到:
评论

相关推荐

    一篇讲动态代理的好文 <动态代理的前世今生>

    动态代理提供了一种更加灵活的方式来实现代理模式,尤其适合于那些需要在运行时动态配置或扩展功能的系统。 #### 三、动态代理的历史与发展 动态代理的思想可以追溯到面向对象编程的早期阶段。随着面向对象技术的...

    动态代理示例

    在Java编程语言中,动态代理是一种强大的特性,它允许我们在运行时创建代理对象来扩展或拦截其他对象的行为。动态代理通常用于实现AOP(面向切面编程)中的通知、日志记录、性能监控等目的。下面我们将深入探讨动态...

    jdk动态代理 + 拦截器实现小例

    在这个“jdk动态代理 + 拦截器实现小例”中,我们将探讨如何利用Java的InvocationHandler接口和Proxy类来实现拦截器模式,以实现灵活的代码扩展和日志记录、性能监控等需求。 首先,让我们理解什么是动态代理。在...

    动态代理原理详细指南

    以日志记录为例,假设有一个计算服务接口`Calculator`,静态代理可以创建一个`LoggingCalculatorProxy`类,实现`Calculator`接口并在调用实际计算方法前/后记录日志。使用JDK动态代理,我们可以创建一个`...

    11 动态代理的例子

    在本例中,我们将探讨如何使用Java的内置API——java.lang.reflect包中的Proxy和InvocationHandler接口来创建动态代理。 首先,我们需要理解一个关键概念:代理。代理是目标对象的一个替代品,它在调用实际目标对象...

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

    动态代理是实现AOP的一种常用技术,它允许在运行时创建代理对象,拦截对真实对象的调用,并在调用前后添加额外的行为。 在Java开发中,反射机制是实现动态代理的关键技术之一。反射提供了在运行时访问和操作类的...

    一个简单的java动态代理的实例

    在本例中,`springTest`可能是与Spring框架相关的测试,因为Spring也支持动态代理(例如,AOP代理)。Spring的代理机制可以自动创建代理对象,但原理基本相同,只是实现方式更高级,支持CGLIB等其他代理技术。 总之...

    基于Java动态代理和反射机制实现ORM

    动态代理是在运行时创建一个接口的实现类,这个实现类会调用我们指定的方法。Java中的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口提供了实现动态代理的能力。反射则是Java提供的一种...

    以muppet为例封装动态代理简化使用1

    【动态代理原理与Muppet封装】\n\n动态代理是一种编程技术,允许我们在不修改原始对象(被代理对象)的基础上,增加额外的功能或控制。在Java中,JDK提供了对动态代理的支持,允许我们在运行时创建符合指定接口的新...

    优秀的设计模式示例-动态代理模式

    动态代理模式是一种在运行时创建代理对象以控制或扩展原有对象行为的设计模式。它允许我们为现有的对象提供一种代理以增强其功能,而无需修改原对象的代码。动态代理模式通常用于实现对目标对象的额外操作,如日志...

    动态代理代码实现

    4. **创建代理对象**:通过调用`create()`方法,CGLIB会动态生成一个目标类的子类,并返回其实例。 5. **方法调用**:通过代理对象调用方法时,CGLIB会将调用转发到`MethodInterceptor`的`intercept()`方法。 ### ...

    设计模式之动态代理与spring的aop编程

    动态代理是一种在运行时创建对象的机制,它允许我们在不修改原对象代码的情况下,为对象增加额外的功能或行为。在Java中,我们可以使用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现...

    动态代理/获取代理IP工具

    在本例中,"动态代理/获取代理IP工具"可能是一个软件应用,它能够帮助用户获取并管理代理IP地址。 首先,我们要理解什么是代理IP。代理IP(也称为中转IP)是一种网络服务,它允许用户通过另一个服务器的IP地址来...

    Java+单例+多例+工厂+枚举+动态代理===》演示

    单例设计模式案例演示 单例模式,是一种常用的软件设计模式。通过单例模式可以保证系统中,**应用该模式的这个类只有一个实例**。即一个类只有一个对象实例。 #### 单例设计模式实现步骤 ...动态代理案例演示

    java模式设计-代理模式之动态代理.ppt

    在Java中,动态代理是代理模式的一种实现方式,它允许我们在运行时创建代理对象,这种方式比静态代理更加灵活。动态代理在JDK 1.3及以后的版本中得到了支持,主要涉及到三个核心类:`Proxy`、`InvocationHandler`和`...

    使用代理实现简易的spring aop功能

    在本例中,我们将创建一个自定义的Bean工厂,它将利用动态代理来增强Bean的行为。 1. **创建目标对象(Target Object)**:这是我们要添加AOP逻辑的对象。例如,我们可能有一个`Calculator`类,它包含一些计算方法...

    代理例delegate.rar

    本文将详细解析代理的概念及其在C#中的应用,通过分析标题"代理例delegate.rar"以及相关文件,如selectSort.cs、math.cs、MuliDelegate.cs和delegate.cs,我们将深入探讨代理的使用。 代理在C#中是一种类型安全的...

    java中动态代理,springAop.pdf

    Java中的动态代理是一种强大的设计模式,它允许我们在运行时创建对象的代理,这些代理对象能够扩展或修改原对象的行为。Spring AOP(面向切面编程)是Spring框架的一部分,它利用了动态代理来实现切面的功能,如日志...

    JAVA动态代理模式.pdf

    以Java动态代理实现为例,`ReflectProxy`类实现了`InvocationHandler`接口,并通过`factory()`方法创建代理对象。`ReflectProxy`的构造函数接受一个要代理的对象,这样`invoke()`方法可以在调用代理对象的任何方法时...

Global site tag (gtag.js) - Google Analytics