java 动态代理

来源:互联网 发布:必智软件 编辑:程序博客网 时间:2024/05/29 23:45

http://blog.csdn.net/mhmyqn/article/details/48474815#comments
http://blog.csdn.net/luanlouis/article/details/24589193#comments

动态代理工作的基本模式就是将自己的方法功能的实现交给 InvocationHandler角色,外界对Proxy角色中的每一个方法的调用,Proxy角色都会交给InvocationHandler来处理,而InvocationHandler则调用具体对象角色的方法。如下图所示:

在面向对象的编程之中,如果我们想要约定Proxy 和RealSubject可以实现相同的功能,有两种方式:
a.一个比较直观的方式,就是定义一个功能接口,然后让Proxy 和RealSubject来实现这个接口。
b.还有比较隐晦的方式,就是通过继承。因为如果Proxy 继承自RealSubject,这样Proxy则拥有了RealSubject的功能,Proxy还可以通过重写RealSubject中的方法,来实现多态。
在这种模式之中:代理Proxy 和RealSubject 应该实现相同的功能,这一点相当重要。(我这里说的功能,可以理解为某个类的public方法)

JDK 动态代理是在程序运行过程中,根据被代理的接口来动态生成代理类的class文件。相关的两个类:

  • interface InvocationHandler
    Object invoke(Object proxy,Method method,Objects[] args)
  • Class Proxy

JDK 提供 java.lang.reflect.Proxy类来实现动态代理,通过Object newProxyInstance(ClassLoader loader,Class<?>interface,InvocationHandler h) 生成代理对象,它会与代理对象关联,当请求分发到代理对象后,会自动执行h.invoke() 方法;
对于代理的接口的实际处理是 java.lang.reflect.InvocationHandler,他提供了一个 invoke方法供是实现者提供相应的代理逻辑的实现。

所有的方法功能的实现都统一调用了InvocationHandler的invoke()方法。

0 0