java api 创建动态代理

默认分类 · 2021-09-05

什么是动态代理?动态代理是相对于静态代理而言的,是指在程序运行期间,动态的创建出一个虚拟的代理对象。相较于静态代理,动态代理,只需要接口和目标类,不再需要一个真实的代理类了。

基本语法

import java.lang.reflect.Proxy;
Proxy.newProxyInstance(){
  loader,  //类加载器(目标类的类加载器)
  interfaces, //接口数组(目标类和虚拟代理类的共同接口的字节码对象)
  h // 句柄接口(虚拟代理处理问题的具体实现)
}

具体实现,

假设已经有了一个目标类Target,一个目标类的接口TargetInterface,一个方法show,一个带参方法say(int x)

TargetInterface targetPorxy = Porxy.newProxyInstace(){
  Target.class.getClassloader(),
  new class[]{TargetInterface.class},
  new InvocationHandler(){
    public Object invoke(Object proxy, Method method, object[] args){      
      //代理在目标对象之前搞手段……
      Object invoke = method.invoke(new Target(),args);//通过反射执行目标对象
      //代理在目标对象之后偷偷搞事情……
      return null;
    }
  }
}

// 代理对象执行方法
targetPorxy.show()
targetPorxy.say(100)

InvocationHandler接口突然把人整的有点蒙了,特别介绍一下

new InvocationHandler(){
  /*
   * 重点理解和记忆invoke()的两个参数,Method method 和 object[] args
   * Method method 是 目标对象的字节码对象
   * object[] args 是 目标对象方法的参数
  */
  public Object invoke(Object proxy, Method method, object[] args){ }
}

接着又牵扯出另一个问题,如何参数传递给目标对象,这是通过代理对象调用方法实现的,如:targetProxy.say(100)

注意的地方

这种JDK实现的动态代理,要求目标对象必须有接口,没有接口这件事情就做不了


看来想把这个动态代理说清楚,还是一件挺麻烦的事情,需要多写才行,以后需要时不时的来看看想想,做到烂熟于心

java
Theme Jasmine by Kent Liao