JAVA的动态代理机制

  

InvocationHandler  is 从而interface  implemented  by 从而invocation  handler  of  a  proxy 实例。      Each  proxy  instance  has  an  associated  invocation 处理程序只When  a  method  is  invoked 提醒a  proxy 例如,,   从而method  invocation  is  encoded 以及dispatched 用,invoke  method  of  its  invocation 处理程序。

代理实例的调用处理程序需要实现InvocationHandler接口。

每个代理实例都关联了一个调用处理程序。当一个方法被代理实例调用时,这个方法的调用就会被加密并分发到调用程序的调用方法上。

翻译的很拗口,没关系,代会看代码的执行流程就明白了。

这个调用处理程序有一个调用方法:

Object 调用(Object 代理,Method 方法,对象[],args), throws  Throwable

处理代理对象的调用方法并返回结果。当代理对象绑定的调用程序被调用时,这个方法就会被调用程序调用。

代理被调用方法的代理对象

方法代理对象调用接口方法的相应方法。

args通过代理对象接口调用方法传入的对象数组。接口方法没有参数则为空。

下面来看看代理的文档描述:

public  class  Proxy  extends  Object  implements 可序列化的 Proxy  provides  static  methods  for  creating  dynamic  Proxy  classes 以及实例,以及it  is  also 从而superclass  of  all  dynamic  Proxy  classes  created  by  those 方法。

代理提供静态方法创建动态代理了类和对象,同时也是这些方法创建代理对象的超类。

动态代理类是一个在运行时实现了一系列指定接口的方法的类。代理方法实现代理接口,代理类创建代理对象,每个代理类都关联了一个实现了InvocationcationHandler接口的调用程序。代理对象的调用方法通过他的代理接口,被分发到实例调用程序的调用方法上。通过反射机制,这个指定的方法就被调用了,并且传入一个对象数组。

<李>

代理的一些属性:

<李>

代理类是公共的,决赛,和非抽象的

<李>

代理类无需指定合法的名称,类名会以“开头

<李>

代理类需要继承代理

<李>

代理类需要按顺序实现创建时指定的各个接口

<李>

如果代理类实现的是非公共接口,那么它需要被定义在接口的同名包下。

<李>

由于代理类在创建时实现了指定的所有接口,所以在类对象上调用getinterface,将会返回一个接口列表的数组,调用getMetjods,将会返回实现所有接口方法的数组。调用getMethod将会返回代理预期的方法。

<李>

代理。isProxyClass判断是不是代理方法

<李>

代理类的java.security.ProtectionDomain,和系统类一样在被启动类加载

<李>

每一个代理类都有一个带惨构造方法,实现InvocationHandler接口,并绑定调用程序到代理对象上。相比通过反射机制去获取构造方法,代理对象可以通过调用Proxy.newProxyInstance方法来构造代理对象。

代理接口的属性

<李>

代理类实现代理接口

<李>

每一个代理实例都通过构造方法关联了一个调用程序。静态方法Proxy.getInvocationHandler将会返回一个由代理对象指定的调用程序

<李>

代理对象的接口方法调用将会被加密和分发到调用处理程序的调用方法上。

<李>

hasCode,等于,toString等方法的调用都会被加密和分发到调用程序的调用方法,接口方法也被同样的加密和分发。

话不多说,代码奉上:

首先定义一个接口:

package  com.shadow.proxy.dynamicproxy;/* *   ,*   ,* @author ,阳光明媚   ,*/public  interface  ITask  {   ,,,public  void  setData (String 数据);   ,,,public  int  getCalData (int  x);   }

定义一个实现接口业务的真实主题:

package  com.shadow.proxy.dynamicproxy;/* *   ,*   ,* @author ,阳光明媚   ,*/public  class  TaskImpl  implements  ITask  {      ,,@Override   ,,,public  void  setData (String 数据),{   ,,,,,,,System.out.println(时间+ data “data  is 保存”);   ,,,}      ,,@Override   ,,,public  int  getCalData (int  x), {   ,,,,,,,return  x  *, 10;   ,,,}   ,,,,   }

JAVA的动态代理机制