`

[原]代理模式-动态代理

阅读更多

[关键字]:java,design pattern,设计模式,《Java与模式》学习,Proxy Pattern,代理模式,动态代理,Dynamic Proxy
[环境]:StarUML5.0 + JDK6
[作者]:Winty (wintys@gmail.com) http://www.blogjava.net/wintys/
[正文]:



 

 

package pattern.proxy.dynamic;

import java.lang.reflect.Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
 * 代理模式:Proxy Pattern
 * Java对代理模式的支持:
 * java.lang.reflect.Proxy、java.lang.reflect.InvocationHandler.
 * @version 2009-6-27
 * @author Winty(wintys@gmail.com)
 */
public class DynamicProxyTest{
    public static void main(String[] args){
        Subject subject = new RealSubject();
        Subject proxy = (Subject)DynamicProxySubjectFactory.factory(subject);
        proxy.request();
    }
}


/**
 * 抽象主题角色
 */
abstract interface Subject{
    public void request();
}


/**
 * 真实主题角色
 */
class RealSubject implements Subject{
    @Override
    public void request(){
        System.out.println("do request.");
    }
}


class DynamicProxyHandler implements InvocationHandler{
    private Subject realSubject;

    public DynamicProxyHandler(Subject realSubject){
        this.realSubject = realSubject;
    }

    //proxy代表Proxy生成的代理对象实例$Proxy0
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable{
        
        preRequest();
        Object result = method.invoke(realSubject , args);
        postRequest();

        return result;
    }

    private void preRequest(){
        System.out.println("do preRequest");
    }

    private void postRequest(){
        System.out.println("do postRequest");
    }
}

/**
 * 动态代理类工厂 : 由Poxy类动态生成一个代理类(如:$Proxy0)。
 */
class DynamicProxySubjectFactory{
    /**
     * @param subject 被代理的真实对象。Subject必须为接口,
     *  即subject的真实类型是实现了Subject接口的类。
     *  因为JDK的动态代理并不能随心所欲的代理所有的,
     *  Proxy.newProxyInstance()的第二个参数决定只能代理接口。
     *
     * @return 代理类实例
     */
    public static Object factory(Subject subject){
        Class<?> cls = subject.getClass();
        DynamicProxyHandler handler = new DynamicProxyHandler(subject);

        return Proxy.newProxyInstance(cls.getClassLoader(),
                                                        cls.getInterfaces(),
                                                        handler);
    }
}



 运行结果:
do preRequest
do request.
do postRequest

运行时,如果出现类似如下错误,则可能的原因是没有把Subject声明为接口
java.lang.ClassCastException: $Proxy0 cannot be cast to pattern.proxy.dynamic.Subject

[参考资料]:
[1] 《Java与模式》: 电子工业出版社
[2] 代理模式(Proxy pattern) 转载 : http://www.blogjava.net/terry-zj/archive/2006/06/20/53937.html
[3] Java动态代理实现 : http://blog.csdn.net/kongxx/archive/2005/07/04/413021.aspx
[4] Java动态代理 : http://www.mxjava.com/blog/archives/224.html
[5] java动态代理实现数据库事务拦截器 : http://www.mxjava.com/blog/archives/60.html
[6] Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP : http://www.javaresearch.org/article/16922.htm

  • 大小: 80.1 KB
分享到:
评论

相关推荐

    设计模式专题之(六)代理模式---设计模式代理模式示例代码(python--c++)

    首先,代理模式的核心思想是为一个对象提供一个替身或代理,以便增加新的功能或控制对原对象的访问。代理模式分为三种类型:远程代理、虚拟代理和保护代理。在远程代理中,代理对象位于客户端,而原始对象位于远程...

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

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

    Java设计模式-代理模式例子

    代理模式的核心思想是为一个对象提供一个替身,这个替身即代理对象,代理对象控制对原对象的访问。在Java中,代理模式主要有静态代理和动态代理两种实现方式。 1. 静态代理:在编译时就已经确定了代理类与目标类的...

    设计模式--代理模式

    代理模式是一种常用的设计模式,它在软件开发中扮演着重要角色,允许我们通过一个代理类来控制对原对象的访问。在《设计模式:可复用面向对象软件的基础》(通常称为GoF设计模式)中,代理模式被定义为“为其他对象...

    动态代理设计模式-源码

    动态代理设计模式是一种在运行时创建对象代理的技术,它允许我们为现有的对象提供额外的功能,而无需修改原对象的代码。这种模式的核心是接口和代理类,通过接口,代理类可以与原对象进行通信,同时在代理类中添加...

    设计模式-代理模式

    代理模式是一种常用的设计模式,它在软件开发中扮演着重要的角色,特别是在iOS平台的应用程序设计中。代理模式的核心思想是为一个对象提供一个替身或代理,以控制对这个对象的访问。这种模式允许我们通过代理来间接...

    2 代理模式-课程内容.rar

    代理模式的核心思想是为一个对象提供一个代理,这个代理对象作为原对象的替代品,可以控制对原对象的访问,或者在调用原对象的基础上增加额外的功能。代理可以在客户端和目标对象之间起到中介的作用,它可以实现如...

    桥接模式-代理-iOS

    代理模式提供了一个代表原对象的对象,这个代理对象可以控制对原对象的访问,或者在调用原对象的方法前后添加额外的行为。在iOS开发中,代理模式通常通过遵循协议来实现。例如,UITableViewDataSource和...

    动态代理设计模式 日志和源码

    动态代理设计模式是一种在运行时创建代理对象的技术,它允许我们为现有的对象提供额外的功能,如日志记录、性能监控、事务管理等,而无需修改原对象的代码。这种模式在Java和许多其他编程语言中都有应用,尤其在...

    Spring学习笔记(13)----动态代理模式分析演示

    动态代理模式是Java编程中一种重要的设计模式,它允许我们在不修改原对象代码的情况下,为对象添加额外的功能或行为。Spring框架广泛利用了动态代理来实现依赖注入、AOP(面向切面编程)等核心功能。 首先,我们...

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理) Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解...

    java装饰模式及动态代理模式示例源码

    装饰模式和动态代理模式是Java编程中两种非常重要的设计模式,它们都在代码的扩展性和灵活性方面发挥着关键作用。下面将分别对这两种模式进行详细解释,并结合手写的数据库连接池和动态代理模式的使用进行深入探讨。...

    Android设计模式之代理模式(Proxy Pattern)

    代理模式的核心思想是创建一个代理类,该类作为原对象的代理,它拥有与原对象相同的方法接口,但在调用这些方法时,代理类可以执行一些额外的操作。这些额外的操作可以包括但不限于验证、日志记录、事务管理、缓存等...

    java静态代理、动态代理、装饰设计模式

    代理模式通常用于增加额外的功能或在访问原对象时进行额外的操作,比如日志记录、安全控制、性能统计等。Java提供了两种实现代理的主要方式:静态代理和动态代理。 **静态代理** 静态代理是最基础的形式,它需要...

    java代理模式和动态代理

    代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。这种方式可以在客户端和目标对象之间建立一个间接层,通过该层可以添加额外的功能,如权限检查、日志记录等。 ##### 2. 生活中的例子 ...

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

    这种通过代理模式实现的AOP方法,可以很好地将业务逻辑代码与额外的横切关注点分离,使得代码更加清晰,易于维护。如果将来需要去除日志记录功能,只需要替换掉代理类的实例,而不需要修改任何业务逻辑代码。此外,...

    JAVA设计模式(代理模式)

    代理模式的核心思想是为一个对象提供一个替身,这个替身即代理对象,代理对象可以控制对原对象的访问。在实际应用中,代理模式常用于增加功能、安全控制、性能优化等方面。 代理模式主要有以下几种类型: 1. **...

    设计模式之代理模式Proxy

    代理模式是设计模式中的一种结构型模式,它在对象交互中起到了中介的作用,允许通过代理对象来控制对原对象的访问。代理模式的核心思想是为一个对象提供一个替身,以便增加新的功能或者控制对原对象的访问。这种模式...

    java设计模式(工厂模式,动态代理,责任链模式……)实例源码

    2. 动态代理:动态代理模式在Java中主要通过Java的反射API和InvocationHandler接口实现。它可以动态地生成一个代理类,该代理类能够拦截对原对象的调用,并在调用前后添加额外的行为。这种模式常用于AOP(面向切面...

    代理模式实例

    代理模式是一种设计模式,它是结构型模式的一种,主要用于在对象之间提供一个代理以控制对原对象的访问。在这个实例中,我们看到的是如何通过代理模式来实现某种功能的增强或控制。下面将详细讲解代理模式的基本概念...

Global site tag (gtag.js) - Google Analytics