当前位置:首页 > 百科

动态代理类

动态代理类是位于Java.lang.reflect包下类别的Interface Invoca来自tionHandler。

  • 中文名称 动态代理类
  • 外文名称 无
  • 位于 Java.lang.reflect包下
  • 类别 Interface InvocationHandler

动态代理类

简介

  Java动态代理类位于Java.lang.refl来自ect包下,一般主要涉及到以杀实李免南用站石正下两个类:

  一、Interf360百科ace InvocationHandler:冷威吗名虽挥该接口中仅定义了一个方法Object:invoke(Object obj,Method method,Object[] args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,args为该方法的参数数组。这个抽象方法在代理类中动态实现。

  二、Proxy:该类即为动态代理类,作用类似于上随的影极核帝块子它响减例中的ProxySubject,其中主要包含以下内容:

  则断钢突取川居Protected Proxy(Invocation搞频依力常阳政Handler h):构造函数,估计用于给内部感者联品州抓强地设某解的h赋值。

  Static Class getProxyClass (ClassLo兰千精重应攻ader loader,Class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。

  St信岩盐核游轴项轮目志atic Object newProxyInstance(ClassLoader loader,Class片所代讲望最已屋[] interfaces,般星变InvocationHandler h):返回代造角察宽价理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)。

  所谓Dy际缩namic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给兴接轻长意沉架它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些in迫执示圆修劳刚许terface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。

  在使用动损船技讨取宗升座查态代理类时,我们必须实现InvocationHandler接口,以第一节中的示例为例:

  抽象角色(之前是抽象,此处应改为接口):

  教整同批public interface Subject

  {

  abstract public void request();

  }

  具体础测夫范议工仅周宪朝角色RealSubject:同上;

代理机制及特点

  通过实现 InvocationHandler 接口创建自己的调用处理器;

  通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;

  通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;

  通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入。

代理角色

  import java.lang.reflect.Method;

  import java.lang.reflect.InvocationHandler;

  public class DynamicSubject implements InvocationHandler {

  private Object sub;

  public DynamicSubject() {

  }

  public DynamicSubject(Object obj) {

  sub = obj;

  }

  public Object invoke(Object proxy,Method method,Object[] args) throws Throwable {

  System.out.println("before calling " + method);

  method.invoke(sub,args);

  System.out.println("after calling " + method);

  return null;

  }

  }

  该代理类的内部属性为Object类,实际使用时通过该类的构造函数DynamicSubject(Object obj)对其赋值;此外,在该类还实现了invoke方法,该方法中的

  method.invoke(sub,args);

  其实就是调用被代理对象的将要被执行的方法,方法参数sub是实际的被代理对象,args为执行被代理对象相应操作所需的参数。通过动态代理类,我们可以在调用之前或之后执行一些相关操作。

客户

  import java.lang.reflect.InvocationHandler;

  import java.lang.reflect.Proxy;

  import java.lang.reflect.Constructor;

  import java.lang.reflect.Method;

  public class Client

  {

  static public void main(Strin来自g[] args) throws Throwable

 360百科 {

  RealSubject rs = new RealSubject(); //在这里指定被代理类

  InvocationHandler ds = new DynamicSubject(rs); //剧仍初始化代理类

  Class cls = rs.getClass();

  //以下是分解步骤

  /*

  Class c 本素待= Proxy.getProxyClass(cls.getClassLoader(),cls.getInterf证农每未系历功度发望件aces()) ;

  Constructor ct=c.getConst未且核ructor(new Class[]{InvocationHandler.class});

  Subject subject =(Subject) ct.newInstance(new Object[]{ds});

  */

适与所行拿  //以下是一次性生成

  Subject subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(),

  cls.getInte课均表粮帝门帮站正纸rfaces(),ds);

  subject.request();

  }

  通过这种方式,被代理的对象(RealSubject)可以在运行时动态改变,需要控制的接口(Subject接口)可以在运行时改变,控制的方式(DynamicSubject类)也可以跳应动态改变,从而实现了非粮沙意虽难不革打余与常灵活的动态代理关系(参见文献2)。

参考文献

  ⒈ 阎宏,《Java 与模式》

  ⒉ 透明,《动态代理的前世今生》

  ⒊ Forest Hou,《Dynamic Proxy 在 Java R适顶伟胜制规据煤MI 中的应用》

声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:fendou3451@163.com
标签:

  • 关注微信
上一篇:喜树碱
下一篇:岩须

相关文章