美文网首页
认识动态代理随笔

认识动态代理随笔

作者: wbobo | 来源:发表于2018-11-15 22:15 被阅读0次

    1. 什么是动态代理

    静态代理是一般是由委托类和代理类实现同一个接口,代理类使用组合的方式来对委托类进行扩展代理过滤等

    例如:

    interface A{

    void say();

    }

    //委托类

    class B implements A{

    void say(){

    System.out.println("good bye");

    }

    }

    //代理类

    class BProxy implements A{

    A b;

    public BProxy(A b){

    this.b = b;

    }

    void say(){

    System.out.println("扩展一下");

    b.say();

    }

    }

    静态代理是运行前代理类就已经定义好的了,由程序员创建或特定工具自动生成源代码,也就是在编译时就已经将接口,

    被代理类,代理类等确定下来。在程序运行之前,代理类的.class文件就已经生成。

    而动态代理则是在运行时根据java代码中的指示形成的,一般通过Proxy类和InvocationHandler接口来实现

    2, 动态代理中invoke方法是如何自动被调用的

    invoke方法有3个参数invoke(Object proxy, Method method, Object[] args)

    @param  proxy the proxy instance that the method was invoked on

    @param  method the {@code Method} instance corresponding to

    the interface method invoked on the proxy instance.

    根据源码对参数的解释可以知道proxy是Proxy类实例,而method则是代理类所调用的委托类的方法对象

    args为方法参数

    newProxyInstance方法也有3个参数newProxyInstance(ClassLoader loader,Class[] interfaces,

    InvocationHandler h)

    @param  loader the class loader to define the proxy class

    @param  interfaces the list of interfaces for the proxy class to implement

    @param  h the invocation handler to dispatch method invocations to

    load 是定义代理类的类加载器,

    interface    是代理类需要去实现的一些接口(即委托类实现的接口)

    h    是一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,

    会关联到哪一个InvocationHandler对象上

    通过查看

    Class cl = getProxyClass0(loader, intfs);

    所生成的代理类$Proxy0.class的源码可知,其继承了Proxy类并实现了给定的接口interfaces,当调用方法时,会执行

    关联的InvocationHandler对象的invoke方法即

    super.h.invoke(this, m4, (Object[])null);

    相关文章

      网友评论

          本文标题:认识动态代理随笔

          本文链接:https://www.haomeiwen.com/subject/ffiufqtx.html