JavaDriver JavaDriver
首页
  • 基础
  • 并发
  • JVM
  • 设计模式
  • 计算机网络
  • 操作系统
  • 数据结构
  • 算法
  • MYSQL
  • REDIS
  • Netty
  • Kafka
系统设计
非技术
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

YoungAnn

西二旗Java老司机一枚 致力于社会主义添砖Java
首页
  • 基础
  • 并发
  • JVM
  • 设计模式
  • 计算机网络
  • 操作系统
  • 数据结构
  • 算法
  • MYSQL
  • REDIS
  • Netty
  • Kafka
系统设计
非技术
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 基础

    • Java 异常有哪些类型?
    • HashMap 与 ConcurrentHashMap 的实现原理是怎样的?
    • Java 中接口和抽象类的区别
    • 为什么重写 equals 必须重写 hashcode ?
    • == 和 equals() 的区别?
    • String,StringBuffer,StringBuilder 之间有什么区别?
    • 简述 ArrayList 与 LinkedList 的底层实现以及常见操作的时间复杂度
    • 简述 BIO, NIO, AIO 的区别
    • 在一个静态方法内调用一个非静态成员为什么是非法的?
    • 简述 Java 的反射机制及其应用场景
    • Java 类的加载流程是怎样的?
    • 什么是双亲委派机制?
    • Java 中 sleep() 与 wait() 的区别
    • 简述 Java 中 final 关键字的作用
    • String 类能不能被继承?为什么?
    • Java 缓冲流 buffer 的用途和原理是什么?
    • 简述动态代理与静态代理
      • 简述动态代理与静态代理
    • 阻塞队列都有哪几种,有什么区别?
    • 简述 HashSet 实现原理
  • 并发

  • JVM

  • 设计模式

  • Java相关
  • 基础
YoungAnn
2022-04-04
目录

简述动态代理与静态代理

# 简述动态代理与静态代理

静态代理 动态代理
由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的 .class 文件就已经存在了 在程序运行时运用反射机制动态创建而成,动态就是在程序运行时生成的,而不是编译时。
应用场景 AspectJ AOP Spring AOP、RPC 框架
优点 在不修改目标对象的前提下,可以通过代理对象对目标对象功能扩展 不会会产生很多静态类,通过一个代理类完成全部的代理功能
缺点 1.代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。
2.代理对象只服务于一种类型的对象,如果要服务多类型的对象。势必要为每一种对象都进行代理,静态代理在程序规模稍大时就无法胜任了。

1.AspectJ 的底层技术就是静态代理,用一种 AspectJ 支持的特定语言编写切面,通过一个命令来编译,生成一个新的代理类,该代理类增强了业务类,这是在编译时增强,相对于下面说的运行时增强,编译时增强的性能更好。
2.JDK 动态代理:

  • 代理对象,不需要实现接口,但是目标对象要实现接口,否则不能用动态代理
  • 代理对象的生成,是通过 JDK 的 API(反射机制),动态的在内存中构建代理对象,在 Java 中要想实现动态代理机制,需要 java.lang.reflect.InvocationHandler 接口和 java.lang.reflect.Proxy 类的支持
    3.cglib 代理:
  • 静态代理和 JDK 代理模式都要求目标对象实现一个接口,但有时候目标对象只是一个单独的对象,并没有实现任何接口,这个时候就可以使用目标对象子类来实现代理,这就是 cglib 代理。
    *cglib (opens new window)(Code Generation Library)是一个基于 ASM 的字节码生成库,它允许我们在运行时对字节码进行修改和动态生成。cglib 通过继承方式实现代理。它广泛的被许多 AOP 的框架使用,比如我们的 Spring AOP。
    *cglib 包的底层是通过使用字节码处理框架 ASM 来转换字节码并生成新的类。
    *cglib 代理也被叫做子类代理,它是在内存中构建一个子类对象从而实现目标对象功能扩展。
编辑 (opens new window)
上次更新: 2022/05/19, 21:26:01
Java 缓冲流 buffer 的用途和原理是什么?
阻塞队列都有哪几种,有什么区别?

← Java 缓冲流 buffer 的用途和原理是什么? 阻塞队列都有哪几种,有什么区别?→

最近更新
01
电商-商品系统设计
12-17
02
关于如何写OKR
12-09
03
对事不对人 vs 对人不对事
12-09
更多文章>
Theme by Vdoing | Copyright © 2022-2023 YoungAnnn | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式