JDK动态代理底层实现原理 jdk动态代理的实现原理( 二 )


  • ClassLoader loader表示当前使用到的appClassloader 。
  • Class[] interfaces表示目标对象实现的一组接口 。
  • InvocationHandler h表示当前的InvocationHandler实现实例对象 。
静态代理与动态代理的区别主要在
  • 静态代理在编译时就已经实现,编译完成后代理类是一个实际的class文件
  • 动态代理是在运行时动态生成的,即编译完成后没有实际的class文件,而是在运行时动态生成类字节码,并加载到JVM中 。
【JDK动态代理底层实现原理 jdk动态代理的实现原理】JDK动态代理的底层源码分析
  • Proxy中的newProxyInstance 是动态代理的核心(类加载器,要代理的类的接 口,动态代理处理器(MyInvocationHandler)):
    • newProxyInstance(类加载器,要继承的接口)一些安全监测(判断非空等)
    • getproxyClass()(是newProxyInstance() 的核心):
        • 判断接口数组大小(不超过65535)
        • 检查缓存中是否存在该代理类Class对象(若没有下一步创建)
        • 代理类名:定义类名前缀--->拼接计数器num
        • 在内存中通过类名和要实现的接口生成Java字节码bate[]
            • (导出反编译可看)动态生成的代理类内容:
            • 动态代理Class会继承 Proxy,实现指定的接口
            • 实现接口的核心业务方法,方法中调用MyInvocationHandler 的invoke方法
        • 调用native方法 传入(类名、字节码、类的加载器)创建Class对象
  • 通过反射 获取Class对象的构造函数,并new实例($Proxy001)