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


相关文章
|
19天前
|
监控 Java 开发者
Spring AOP动态代理
Spring AOP动态代理
52 1
|
19天前
|
缓存 Java Spring
Spring 源码阅读 66:基于 JDK 的 AOP 代理如何获取拦截器链(4)- 将 Advice 封装为拦截器
【1月更文挑战第1天】本文分析了 Advice 被封装成 MethodInterceptor 的过程,Spring AOP 用到的五种 Advice 中,有些本身就是 MethodInterceptor 的实现类,而有些需要通过适配器的封装。
48 0
|
19天前
|
Java 程序员 API
浅谈JDK动态代理
浅谈JDK动态代理
33 1
|
19天前
|
XML Java 数据格式
浅谈基于动态代理的Spring AOP原理
浅谈基于动态代理的Spring AOP原理
29 0
|
19天前
|
Java
关于JDK动态代理
关于JDK动态代理的一些理解
15 0
|
19天前
|
设计模式 Java API
[Java]静态代理、动态代理(基于JDK1.8)
本篇文章主要是对静态代理和动态代理实现思路的简述,以示例为主,少涉及理论。 如果文中阐述不全或不对的,多多交流。
59 1
[Java]静态代理、动态代理(基于JDK1.8)
|
19天前
|
安全 Java 开发者
JDK 21中的Switch模式匹配:一种更强大且灵活的分支选择机制
本文深入探讨了JDK 21中引入的Switch模式匹配的新特性。这种新的模式匹配机制不仅简化了传统的switch语句,还引入了类型检查和模式匹配,使得代码更加简洁、易读且功能强大。本文将详细介绍Switch模式匹配的语法、使用场景以及与传统switch语句的区别,并通过示例代码展示其在实际开发中的应用。
|
19天前
|
设计模式 安全 Java
深入理解Spring Boot AOP:CGLIB代理与JDK动态代理的完全指南
深入理解Spring Boot AOP:CGLIB代理与JDK动态代理的完全指南
468 1
|
19天前
|
设计模式 Java Spring
Spring AOP基础之代理模式.静态代理和动态代理
Spring AOP基础之代理模式.静态代理和动态代理
33 0
Spring AOP基础之代理模式.静态代理和动态代理
|
19天前
|
Java 数据安全/隐私保护
【面试问题】JDK 动态代理与 CGLIB 区别?
【1月更文挑战第27天】【面试问题】JDK 动态代理与 CGLIB 区别?