JAVA 反射(二)动态代理

概念

在运行期间动态的创建接口的实现
通过生成的代理类,可以完成对接口的实现。

关键类和接口

处理接口方法的接口 InvocationHandler
代理生成类 Proxy

典型代码

创建Foo接口的代理实现

创建某一接口 Foo 的代理:
     InvocationHandler handler = new MyInvocationHandler(...);
     Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
                                          new Class[] { Foo.class },
                                          handler);

步骤

1.对接口方法的处理
首先需要实现InvocationHandler接口,重写invoke方法

public class MyInvocationHandler implements InvocationHandler{
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
      //..所有方法的调用都会在这里执行
  }
}

2.通过Proxy的静态方法生成代理类,或代理对象。

代理对象

Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
                                          new Class[] { Foo.class },
                                          handler);

代理类方式

     InvocationHandler handler = new MyInvocationHandler(...);
     Class proxyClass = Proxy.getProxyClass(
         Foo.class.getClassLoader(), new Class[] { Foo.class });
     Foo f = (Foo) proxyClass.
         getConstructor(new Class[] { InvocationHandler.class }).
         newInstance(new Object[] { handler });

常见用例

动态代理常被应用到以下几种情况中

数据库连接以及事物管理
单元测试中的动态Mock对象
自定义工厂与依赖注入(DI)容器之间的适配器
类似AOP的方法拦截器

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • https://blog.csdn.net/luanlouis/article/details/24589193 ...
    小陈阿飞阅读 4,367评论 1 1
  • 原文: Dyanmic Proxy Classes 介绍 一个动态代理类是实现了多个接口存在于运行时的类,这样,一...
    半黑月缺阅读 4,585评论 0 0
  • 如刀剑样的北风 残忍的斩下秋的尾巴 伏在窗口欲蘸点火锅的麻辣 2016.11.06.
    曹天成阅读 2,767评论 3 3
  • 快放假了,许老四要把被子神马的行李放她大姨家(学校家属院),于是为了方便搬运,向我借自行车(那时常往返大姐家,所以...
    娜娜vikitter阅读 1,787评论 0 1