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

    作者回复: 受教了~

    
    7
  • J.Smile
    2020-12-20
    关键步骤整理: ①克隆入参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

    共 5 条评论
    6
  • 大ccc
    2020-12-17
    又看完了,一周只更新一次让人着急呀😓

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

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

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

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

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

    
    1
  • Frank
    2022-10-07 来自浙江
    可以Dump $Proxyx 类的class文件观察,在java8中通过设置 “-Dsun.misc.ProxyGenerator.saveGeneratedFiles=true”,执行代码后就会生成代理类class文件。

    作者回复: 是的

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

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

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

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

    共 2 条评论
    