本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188
代理设计模式
代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式一般涉及到的角色有:
抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象
图1.代理模式类图
为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别。通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间,从而在设计上获得了更大的灵活性。Java动态代理机制以巧妙的方式近乎完美地实践了代理模式的设计理念。
java动态代理
相关的类和接口
要了解Java动态代理的机制,首先需要了解以下相关的类或接口:
·java.lang.reflect.Proxy:这是Java动态代理机制的主类,它提供了一组静态方法来为一组接口动态地生成代理类及其对象。
清单1.Proxy的静态方法
java.lang.reflect.InvocationHandler:这是调用处理器接口,它自定义了一个invoke方法,用于集中处理在动态代理类对象上的方法调用,通常在该方法中实现对委托类的代理访问。
清单2.InvocationHandler的核心方法
每次生成动态代理类对象时都需要指定一个实现了该接口的调用处理器对象(参见Proxy静态方法4的第三个参数)。
·java.lang.ClassLoader:这是类装载器类,负责将类的字节码装载到Java虚拟机(JVM)中并为其定义类对象,然后该类才能被使用。Proxy静态方法生成动态代理类同样需要通过类装载器来进行装载才能使用,它与普通类的唯一区别就是其字节码是由JVM在运行时动态生成的而非预存在于任何个.class文件中。
每次生成动态代理类对象时都需要指定一个类装载器对象(参见Proxy静态方法4的第一个参数)
代理机制及其特点
首先让我们来了解一下如何使用Java动态代理。具体有如下四步骤:
1.通过实现InvocationHandler接口创建自己的调用处理器;
2.通过为Proxy类指定ClassLoader对象和一组interface来创建动态代理类;
3.通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;
4.通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入。
清单3.动态代理对象创建过程
实际使用过程更加简单,因为Proxy的静态方法newProxyInstance已经为我们封装了步骤2到步骤4的过程,所以简化后的过程如
清单4.简化的动态代理对象创建过程
下面我们来看一个简单实现动态代理的例子:
1.代理类和真实类接口:
2.真实类:
3.具体代理类:
注:该代理类的内部属性是Object类型,实际使用的时候通过该类的构造方法传递进来一个对象。此外,该类还实现了invoke方法,该方法中的method.invoke其实就是调用被代理对象的将要执行的方法,方法参数是sub,表示该方法从属于sub,通过动态代理类,我们可以在执行真实对象的方法前后加入自己的一些额外方法。
4.客户端调用示例:
接下来让我们来了解一下Java动态代理机制Proxy的构造方法:
清单6.Proxy构造方法
接着,可以快速浏览一下newProxyInstance方法,因为其相当简单:
清单7.Proxy静态方法newProxyInstance
由此可见,动态代理真正的关键是在getProxyClass方法,该方法负责为一组接口动态地生成代理类类型对象。
有很多条理由,人们可以否定对class代理的必要性,但是同样有一些理由,相信支持class动态代理会更美好。接口和类的划分,本就不是很明显,只是到了Java中才变得如此的细化。如果只从方法的声明及是否被定义来考量,有一种两者的混合体,它的名字叫抽象类。实现对抽象类的动态代理,相信也有其内在的价值。此外,还有一些历史遗留的类,它们将因为没有实现任何接口而从此与动态代理永世无缘。如此种种,不得不说是一个小小的遗憾。
但是,不完美并不等于不伟大,伟大是一种本质,Java动态代理就是佐例。
分享到:
相关推荐
java程序员-从笨鸟到菜鸟.pdf
曹胜欢在《JAVA程序员 从笨鸟到菜鸟.pdf》中分享了他个人学习Java的经历,从迷茫到逐渐成长的过程。他强调了自学的重要性,并鼓励初学者不要怕走弯路,同时希望自己的经验可以帮助到同样在学习Java的初学者。 2. ...
### Java程序员成长之路——从菜鸟到笨鸟 #### 一、引言 《Java程序员由菜鸟到笨鸟》是一本由曹胜欢编写的书籍,旨在帮助初学者掌握Java编程的基础知识,并逐步进阶至更高级的应用场景。本书不仅适合初学者作为...
Java程序员的成长之路是一个充满挑战与探索的过程,从初学者到熟练掌握各项技能,需要系统性的学习和实践。"Java程序员由菜鸟到笨鸟学习文档"就是这样一个旨在帮助初入Java世界的学习者逐步进阶的资源。它覆盖了从...
### Java程序员从笨鸟到菜鸟 #### 一、开发环境搭建与基本语法 ##### 开发环境搭建 在开始Java的学习之前,首先需要搭建一个合适的开发环境。这通常涉及到以下步骤: 1. **JDK(Java Development Kit)安装**:...
资源名称:《Java程序员-从笨鸟到菜鸟》PDF 下载资源目录:作者简介:..........................................................................................................................................
本书名为《Java程序员由菜鸟到笨鸟》,作者是曹胜欢。虽然无法直接查看具体内容,但基于标题、描述以及常见的Java学习路径,我们可以总结出该书可能涵盖的一些关键知识点。 ### Java基础知识 1. **Java概述**: -...
根据提供的文件信息,“Java程序员由菜鸟到笨鸟”是一本旨在帮助初学者成长为合格Java开发者的书籍。本书作者为曹胜欢,发布日期为2018年3月17日。以下是从该书的标题、描述以及部分可能包含的内容中提炼出的关键...
day01_Object类、常用API day02_Collection、泛型 day03_List、Set、数据结构、Collections day04_Map,斗地主案例 day05_异常,线程 day06_线程、同步 day07_等待与唤醒案例、线程池、Lambda...Java基础小节练习题答案
《Java游戏:笨鸟》(也称为FlappyBird)是一款基于Java编程语言开发的简单游戏,旨在帮助初学者更好地理解和掌握Java编程基础。这款游戏的实现涉及了许多Java编程的关键概念和技术,下面将对这些知识点进行详细阐述...