动态代理

静态代理

  • 创建一个接口,然后创建目标类实现该接口并且实现该接口中的抽象方法。之后再创建一个代理类,同时使其也实现这个接口。在代理类中持有一个目标对象的引用,而后在代理类方法中调用该对象的方法

动态代理

  • 利用反射机制在运行时动态创建代理类

  • JDK动态代理使用步骤

    • 创建被代理的接口和类
    • 创建InvocationHandler接口的实现类,在invoke方法中实现代理逻辑
    • 通过Proxy的静态方法newProxyInstance( ClassLoaderloader, Class[] interfaces, InvocationHandler h)创建一个代理对象
    • 使用代理对象
  • 实现原理

    • 在Proxy.newProxyInstanceProxy方法内部,会调用Generator类的generateProxyClass()方法来生成代理类的字节码,需要传入参数:代理类需要实现的接口数组
    • generateProxyClass()方法根据传入的接口数组,动态的成Class文件,包括字段和方法
    • JDK动态代理产生的代理类【继承】Proxy类,java是单继承,jdk动态代理是以实现接口的方式来执行的,并且【实现】接口数组中所有的接口
    • 代理类只有唯一构造方法,参数是InvocationHandlerd对象;构造方法内部逻辑是,把InvocationHandlerd对象传给父类Proxy类,也就是把InvocationHandlerd对象注入到Proxy类当中
    • 在创建InvocationHandlerd对象的时候,我们把目标对象注入到了InvocationHandlerd对象中(目标对象注入到InvocationHandlerd中,InvocationHandlerd对象注入到Proxy中)
    • 在使用代理类时,执行相应方法时,代理对象调用的是父类(Proxy类)中InvocationHandlerd对象的invoke方法,也就是我们之前重写的invoke方法:代理逻辑在此方法内
    • 在InvocationHandlerd对象的invoke方法内,除了代理逻辑,还调用了目标对象的被增强的方法(在创建InvocationHandlerd对象时,目标对象注入到了InvocationHandlerd中)

你可能感兴趣的:(动态代理)