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的方法拦截器

你可能感兴趣的:(JAVA 反射(二)动态代理)