当前播放: 16 | JDK动态代理:为什么Proxy.newProxyInstance会生成新的字节码?
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
课程目录
第一章:Spring AOP总览 (21讲)
01 | 课程介绍
免费
02 | 内容综述
免费
03 | 知识储备:基础、基础,还是基础!
免费
04 | AOP引入:OOP存在哪些局限性?
免费
05 | AOP常见使用场景
免费
06 | AOP概念:Aspect、Join Point和Advice等术语应该如何理解?
07 | Java AOP设计模式:代理、判断和拦截器模式
08 | Java AOP代理模式(Proxy):Java静态代理和动态代理的区别是什么?
09 | Java AOP判断模式(Predicate):如何筛选Join Point?
10 | Java AOP拦截器模式(Interceptor):拦截执行分别代表什么?
11 | Spring AOP 功能概述:核心特性、编程模型和使用限制
12 | Spring AOP编程模型:注解驱动、XML配置驱动和底层API
13 | Spring AOP设计目标:Spring AOP与 AOP框架之间的关系是竞争还是互补?
14 | Spring AOP Advice类型:Spring AOP丰富了哪些AOP Advice呢?
15 | Spring AOP代理实现:为什么Spring Framework选择三种不同AOP实现?
16 | JDK动态代理:为什么Proxy.newProxyInstance会生成新的字节码?
17 | CGLIB动态代理:为什么Java动态代理无法满足AOP的需要?
18 | AspectJ代理代理:为什么Spring推荐AspectJ注解?
19 | AspectJ基础:Aspect、Join Points、Pointcuts和Advice语法和特性
20 | AspectJ注解驱动:注解能完全替代AspectJ语言吗?
21 | 面试题精选
第二章:Spring AOP基础 (20讲)
22 | Spring核心基础:《小马哥讲Spring核心编程思想》还记得多少?
23 | @AspectJ注解驱动
24 | 编程方式创建 @AspectJ代理
25 | XML配置驱动 - 创建AOP代理
26 | 标准代理工厂API - ProxyFactory
27 | @AspectJ Pointcut指令与表达式:为什么Spring只能有限支持?
28 | XML配置Pointcut
29 | API实现Pointcut
30 | @AspectJ拦截动作:@Around与@Pointcut有区别吗?
31 | XML配置Around Advice
32 | API实现Around Advice
33 | @AspectJ前置动作:@Before与@Around谁优先级执行?
34 | XML配置Before Advice
35 | API实现Before Advice
36 | @AspectJ后置动作 - 三种After Advice之间的关系?
37 | XML配置三种After Advice
38 | API实现三种After Advice
39 | 自动动态代理
40 | 替换TargetSource
41 | 面试题精选
第三章:Spring AOP API设计与实现 (49讲)
42 | Spring AOP API整体设计
43 | 接入点接口 - Joinpoint
44 | Joinpoint条件接口 - Pointcut
45 | Pointcut操作 - ComposablePointcut
46 | Pointcut便利实现
47 | Pointcut AspectJ实现 - AspectJExpressionPointcut
48 | Joinpoint执行动作接口 - Advice
49 | Joinpoint Before Advice标准实现
50 | Joinpoint Before Advice AspectJ实现
51 | Joinpoint After Advice标准实现
52 | Joinpoint After Advice AspectJ实现
53 | Advice容器接口 - Advisor
54 | Pointcut与Advice连接器 - PointcutAdvisor
55 | Introduction与Advice连接器 - IntroductionAdvisor
56 | Advisor的Interceptor适配器 - AdvisorAdapter
57 | AdvisorAdapter实现
58 | AOP代理接口 - AopProxy
59 | AopProxy工厂接口与实现
60 | JDK AopProxy实现 - JdkDynamicAopProxy
61 | CGLIB AopProxy实现 - CglibAopProxy
62 | AopProxyFactory配置管理器 - AdvisedSupport
63 | Advisor链工厂接口与实现 - AdvisorChainFactory
64 | 目标对象来源接口与实现 - TargetSource
65 | 代理对象创建基础类 - ProxyCreatorSupport
66 | AdvisedSupport事件监听器 - AdvisedSupportListener
67 | ProxyCreatorSupport标准实现 - ProxyFactory
68 | ProxyCreatorSupport IoC容器实现 - ProxyFactoryBean
69 | ProxyCreatorSupport AspectJ实现 - AspectJProxyFactory
70 | IoC容器自动代理抽象 - AbstractAutoProxyCreator
71 | IoC容器自动代理标准实现
72 | IoC容器自动代理 AspectJ 实现 - AspectJAwareAdvisorAutoProxyCreator
73 | AOP Infrastructure Bean接口 - AopInfrastructureBean
74 | AOP上下文辅助类 - AopContext
75 | 代理工厂工具类 - AopProxyUtils
76 | AOP工具类 - AopUtils
77 | AspectJ Enable模块驱动实现 - @EnableAspectJAutoProxy
78 | AspectJ XML配置驱动实现 - <aop:aspectj-autoproxy/>
79 | AOP配置Schema-based 实现 - <aop:config/>
80 | Aspect Schema-based实现 - <aop:aspect/>
81 | Pointcut Schema-based实现 - <aop:pointcut/>
82 | Around Advice Schema-based实现 - <aop:around/>
83 | Before Advice Schema-based实现 - <aop:before/>
84 | After Advice Schema-based实现 - <aop:after/>
85 | After Returning Advice Schema-based实现 - <aop:after-returning/>
86 | After Throwing Advice Schema-based实现 - <aop:after-throwing/>
87 | Adviser Schema-based实现 - <aop:advisor/>
88 | Introduction Schema-based实现 - <aop:declare-parents/>
89 | 作用域代理Schema-based实现 - <aop:scoped-proxy/>
90 | 面试题精选
第四章:Spring AOP设计模式 (17讲)
91 | 抽象工厂模式(Abstract factory)实现
92 | 构建器模式(Builder)实现
93 | 工厂方法模式(Factory method)实现
94 | 原型模式(Prototype)实现
95 | 单例模式(Singleton)实现
96 | 适配器模式(Adapter)实现
97 | 组合模式(Composite)实现
98 | 装饰器模式(Decorator)实现
99 | 享元模式(Flyweight)实现
100 | 代理模式(Proxy)实现
101 | 模板方法模式(Template Method)实现
102 | 责任链模式(Chain of Responsibility)实现
103 | 观察者模式(Observer)实现
104 | 策略模式(Strategy)实现
105 | 命令模式(Command)实现
106 | 状态模式(State)实现
107 | 面试题精选
第五章:Spring AOP在Spring Framework内部应用 (7讲)
108 | Spring AOP在 Spring 事件(Events)
109 | Spring AOP在Spring 事务(Transactions)理论基础
110 | Spring AOP在Spring 事务(Transactions)源码分析
111 | Spring AOP在Spring 缓存(Caching)
112 | Spring AOP在Spring本地调度(Scheduling)
113 | 面试题精选
114 | 结束语
16 | JDK动态代理:为什么Proxy.newProxyInstance会生成新的字节码?

16 | JDK动态代理:为什么Proxy.newProxyInstance会生成新的字节码?

小马哥
《Spring Boot编程思想》作者、Spring Cloud Alibaba项目架构师
全集3674
新人首单 ¥69.9 原价 ¥199
3
本节摘要
登录 后留言

精选留言(7)

  • 大ccc
    又看完了,一周只更新一次让人着急呀😓

    作者回复: 小编辑表示压力很大

    2020-12-17
    3
  • J.Smile
    关键步骤整理:
    ①克隆入参interfaces.clone(),防止在代理生成时接口被替换修改。
    ②从Proxy的proxyClassCache属性中获取生成的代理Class.->proxyClassCache.get(loader, interfaces)
    ③第2步中会调用Proxy的内部类ProxyClassFactory的apply方法,会试图加载interface对应的interfaceClass,并在之后进行
    interfaceClass的一系列校验,如是否等于输入的接口的Class类型intf、是否是接口类型、此次加载的接口Class是否已经重复。
    校验不通过则抛出异常。通过进入第4步。
    ④对校验通过的intf生成代理proxyName,格式为:proxyPkg + proxyClassNamePrefix + num;然后通过native方法defineClass0生成代理Class。
    这个proxyClass继承了Proxy类并且实现了输入的intf接口
    ⑤根据proxyClass的有参构造方法(参数为{ InvocationHandler.class })实例化代理对象。

    作者回复: 666

    2020-12-20
    1
    1
  • Masaki
    JDK生成的代理类的包名不总是com.sun.proxy,只有当接口为Public时是这样的,当接口为非public时,生成的代理类与接口所在包名相同。

    作者回复: 受教了~

    2021-03-02
  • 囊子
    InvocationHandler 在哪里被执行invoke方法呢?返回的Proxy(EchoService)类在执行echo方法时,内部是如何被InvocationHandler 拦截到的呢?这些细节在哪里能看到呢?

    作者回复: InvocationHandler 被内部调用,请参考一下源码~

    2021-02-24
    1
  • Dovelol
    vm options参数设置-Dsun.misc.ProxyGenerator.saveGeneratedFiles=true,就可以把生成的代理类的源码保存在com.sun.proxy目录下面,一看这个类就明白,为啥要继承Proxy,还有为啥JDK代理的类一定要有接口,InvocationHandler是怎么被调用的了。

    作者回复: 继承 Proxy 主要有两个目的:
    1. 让代理对象类型上又归属,属于代理的类型,类似于标记接口
    2. 让代理对象可能方位 Proxy 中的 protected 成员,比如:
    protected InvocationHandler h

    2021-01-02
    1
  • 顾苏陈
    小马哥,您关于Java动态代理的源码讲的很深刻,学到了很多,在关于Proxy.newProxyInstance源码的讲解过程中,我发现您把WeakCache说成了 “软引用”,我看了一下WeakCache源码,其实WeakCache的可以等同于WeakReference(是“弱引用”),这一点您的视频中可能一时不小心说错了。

    作者回复: 感谢斧正,也请大家多多留心,课程中其他地方也会出现错误的

    2020-12-20
    1
  • aquavit
    小马哥,动态代理生成的代理类,为啥要继承 Proxy,代理类里面也没有对Proxy属性和方法的引用,这块有没有什么设计思想在里面呢?

    作者回复: 动态代理生成类继承了 Proxy 只有,可以方便的关联 InvocationHandler 对象,而这个对象就是用户自定义实现的。

    2020-12-18
    1
收起评论
看过的人还看
小马哥讲Spring核心编程思想

小马哥  《Spring Boot 编程思想》作者

250讲 | 20110 人已学习

新人首单 ¥99 原价 ¥299
数据结构与算法之美

王争  前Google工程师

81讲 | 111164 人已学习

新人首单 ¥69.9 原价 ¥199
MySQL实战45讲

林晓斌  网名丁奇,前阿里资深技术专家

49讲 | 76807 人已学习

新人首单 ¥69.9 原价 ¥199
设计模式之美

王争  前Google工程师,《数据结构与算法之美》专栏作者

113讲 | 39247 人已学习

新人首单 ¥99 原价 ¥299