JDK动态代理机制(AOP)

简介: 这篇文章主要个大家分享JDK动态代理(AOP)

JDK动态代理(AOP)


1. 代理模式


  • 代理模式是指,为其他对象提供一种代理以控制对这个对象的访问。在某些情况下, 一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户类和目标对象之 间起到中介的作用。
  • 句话说,使用代理对象,是为了在不修改目标对象的基础上,增强主业务逻辑。 客户类真正的想要访问的对象是目标对象,但客户类真正可以访问的对象是代理对象。

微信截图_20220609160747.png

2.代理模式作用


  • 控制访问 :在代理中,控制时否可以调用目标对象的方法。
  • 增强功能 :可以在完成目标对象的调用时,附加一个额外饿功能,这里添加的额外语句叫做功能增强。


3.代理模式的分类


  • 静态代理  :代理类是手工实现的java文件,同时代理的目标是规定好的。
  • 动态代理 :使用反射机制,在程序的执行中,创建代理类对象。


3.1 静态代理


  • 静态代理是指,代理类在程序运行前就已经定义好.java 源文件,其与目标类的关系在 程序运行前就已经确立。在程序运行前代理类已经编译为.class 文件。

微信截图_20220609161207.png

3.2静态代理的缺点


  • 代码复杂,难于管理
    代理类和目标类实现了相同的接口,每个代理都需要实现目标类的方法,这样就出现了大量的代 码重复。如果接口增加一个方法,除了所有目标类需要实现这个方法外,所有代理类也需要实现 此方法。增加了代码维护的复杂度。
  • 代理类依赖目标类,代理类过多
    代理类只服务于一种类型的目标类,如果要服务多个类型。势必要为每一种目标类都进行代理, 静态代理在程序规模稍大时就无法胜任了,代理类数量过多。当接口改变时,影响的目标类与代理类比较多,都需要进行改动。


3.3 静态代理的优点


  • 容易理解,使用方便。


3.4 动态管理


  • 动态代理是指代理类对象在程序运行时由 JVM 根据反射机制动态生成的。动态代理不 需要定义代理类的.java 源文件。
  • 动态代理其实就是 jdk 运行期间,动态创建 class 字节码并加载到 JVM。
  • 动态代理使用jdk的反射机制,创建对象的能力,创建的是代理类的对象。而不是用你创建的类文件。不用写Java文件。


3.6 动态代理的实现方式


  • JDK动态代理(理解) :使用Java反射包中的类和接口实现动态代理的功能。
    **注意:JDK代理中,目标类必须存在接口,但是在CGLIB中目标类可以不存在接口。
反射包:java.lang.reflect ,里面有三个类:InvocationHandler、Method 、Proxy
复制代码
  • CGLIB 动态代理(了解) :
    CGLIB(Code Generation Library)是一个开源项目。是一个强大的,高性能,高质量的 Code 生成类 库,它可以在运行期扩展 Java 类与实现 Java 接口。它广泛的被许多 AOP 的框架使用,例如 Spring AOP。 使用 JDK 的 Proxy 实现代理,要求目标类与代理类实现相同的接口。若目标类不存在 接口,则无法使用该方式实现。 但对于无接口的类,要为其创建动态代理,就要使用 CGLIB 来实现。CGLIB 代理的生成 原理是生成目标类的子类,而子类是增强过的,这个子类对象就是代理对象。所以,使用 CGLIB 生成动态代理,要求目标类必须能够被继承,即不能是 final 的类。 cglib 经常被应用在框架中,例如 Spring ,Hibernate 等。Cglib 的代理效率高于 Jdk。对 于 cglib 一般的开发中并不使用。做了一个了解就可以


3.5 动态代理的优点


  • 不用创建代理类文件,代理的目标类是活动的,可设置的。
  • 可以动态的给不同的目标创建代理。


4.JDK动态代理


  • 反射:Method类,表示方法。类中的方法,通过Method可以执行某个方法。


4.1  InvocationHandler 接口

微信截图_20220609161412.png

4.2 Method 类

微信截图_20220609161419.png

4.3  Proxy 类

微信截图_20220609161428.png

此时这个 Object就相当于静态代理对象taobao


5.JDK实现动态代理的步骤

微信截图_20220609161624.png

6.JDK动态代理执行流程

微信截图_20220609161633.png

7.动态代码能做什么

微信截图_20220609161642.png


相关文章
|
4月前
|
监控 Java 开发者
Spring AOP动态代理
Spring AOP动态代理
76 1
|
25天前
|
Java API 开发者
Jdk动态代理为啥不能代理Class?
该文章主要介绍了JDK动态代理的原理以及为何JDK动态代理不能代理Class。
Jdk动态代理为啥不能代理Class?
|
22天前
|
Java
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
这篇文章是Spring5框架的实战教程,深入讲解了AOP的基本概念、如何利用动态代理实现AOP,特别是通过JDK动态代理机制在不修改源代码的情况下为业务逻辑添加新功能,降低代码耦合度,并通过具体代码示例演示了JDK动态代理的实现过程。
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
|
7天前
|
开发者 C# 容器
【独家揭秘】当WPF邂逅DirectX:看这两个技术如何联手打造令人惊艳的高性能图形渲染体验,从环境搭建到代码实践,一步步教你成为图形编程高手
【8月更文挑战第31天】本文通过代码示例详细介绍了如何在WPF应用中集成DirectX以实现高性能图形渲染。首先创建WPF项目并使用SharpDX作为桥梁,然后在XAML中定义承载DirectX内容的容器。接着,通过C#代码初始化DirectX环境,设置渲染逻辑,并在WPF窗口中绘制图形。此方法适用于从简单2D到复杂3D场景的各种图形处理需求,为WPF开发者提供了高性能图形渲染的技术支持和实践指导。
15 0
|
14天前
|
设计模式 Java C++
揭秘!JDK动态代理VS CGLIB:一场关于Java代理界的‘宫心计’,你站哪队?
【8月更文挑战第24天】Java 动态代理是一种设计模式,允许在不改动原类的基础上通过代理类扩展功能。主要实现方式包括 JDK 动态代理和 CGLIB。前者基于接口,利用反射机制在运行时创建代理类;后者采用继承方式并通过字节码技术生成子类实现类的代理。两者在实现机制、性能及适用场景上有明显差异。JDK 动态代理适用于有接口的场景,而 CGLIB 更适合代理未实现接口的类,尽管性能更优但存在一些限制。开发者可根据需求选择合适的代理方式。
43 0
|
3月前
|
XML Java 数据格式
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
33 0
|
3月前
|
设计模式 Java 程序员
java动态代理(JDK和cglib)
java动态代理(JDK和cglib)
21 0
|
3月前
|
设计模式 Java 程序员
java动态代理(JDK和cglib)
java动态代理(JDK和cglib)
31 0
|
3月前
|
缓存 Java Maven
JDK 动态代理
JDK 动态代理
18 0
|
3月前
|
Java Spring
深入解析Spring源码,揭示JDK动态代理的工作原理。
深入解析Spring源码,揭示JDK动态代理的工作原理。
38 0