Java 中的代理

在 Java 中,代理有两种模式,一种是静态代理,另一种是动态代理。所谓的静态代理,其实就是设计模式中的代理模式。静态代理模式中一共有三个角色:代理对象、目标对象、目标对象的接口。因此,通过静态代理的定义,我们能够知道静态代理就是代理类由程序员自己编写,并且在编译器就确定好了的。

静态代理的用途

控制真实对象的访问权限,通过代理对象控制对真实对象的使用权限。通过静态代理还可以增强真实对象的功能。通过代理调可以在调用真实对象的前后增加额外功能。

Java 的动态代理和反射

Java 静态代理虽然有上述好处,但是静态代理还存在一些局限,比如代理对象的代码需要程序员自己动手写,如果需要同时代理多个对象,这无疑会增加工作的工作量。相比于静态代理,动态代理不需要程序员自己动手写代理对象的代码。

动态代理中代理类不需要再编译器确定,而是可以在运气期间动态生成,从而实现对目标对象的代理功能。

反射是动态代理的一种实现方式。

Java 中动态代理实现的方式

  • JDK 动态代理
    java.lang.reflect 包中的 Proxy 类和 InvocationHandler 接口提供了生成动态代理对象的能力。
  • Cglib 动态代理
    Cglib(Code Generation Library)是一个第三方代码生成类库,运行时在内存中动态生成一个子类对象从而实现对目标对象功能的扩展。

JDK 动态代理和 Cglib 动态代理的区别

  • JDK 动态代理有一个限制,使用动态代理的对象必须实现一个或多个接口。Cglib 没有此要求。
  • Cglib 是一个强大的高性能代码生成包,它可以在运行期扩展 Java 类与实现 Java 接口。它被广泛的用于许多 AOP 框架,例如: Spring AOP 和 dynaop,为它们提供方法的 interception(拦截)。

    Cglib 包的底层是通过使用一个小而快的字节码处理框架 ASM 来转换字节码并生成新的类。

动态代理的用途

servlet 的 filter、Spring 提供的 aop 以及 拦截器、过滤器、mybaits 的分页插件等等

Java 实现动态代理的步骤

  1. 定义一个委托类和公共接口
  2. 自己定义一个类(调用处理器类,即实现 InvocationHandler 接口),这个类的目的是指定运行时生成的代理类需要完成的具体任务(包括 Preprocess 和 Postprecess),即代理类调用任何方法都会经过这个调用处理器类
  3. 生成代理对象

说点什么

avatar
  Subscribe  
提醒

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部