Java的动态代理(Dynamic Proxy)支持在运行时动态地生存代理类/对象。

Map proxy = (Map) Proxy.newProxyInstance(
  this.getClass().getClassLoader(), // 指定class loader
  new Class[] { Map.class }, // 生产的代理类所要实现的接口
  new MyInvocationHandler()); // InvocationHandler对象

生产的代理类在一个class loader里只有一个。 对代理对象的所有方法调用都会经过InvocationHandlerinvoke方法。 在invoke方法里可以做任何事情;最简单是把方法调用转发给目标对象。

public class MyInvocationHandler implements InvocationHandler {
	// 可以将目标对象(target,真正干活的对象)放在构造函数里传入
 
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) 
      throws Throwable {
		// @proxy 是代理对象, @method 是正在被调用的方法, 
		// @args 是方法调用的参数
    }
}

Dynamic Proxy可以用来实现Spring Data的Repository。 在Spring Data中用户只需要定义Repository接口和接口里的方法,Spring Data会帮忙生成实现类。 假设在Repository接口里有一个findByUsername方法,InvocationHandler.invoke在 接收到方法调用时可以解析方法名,然后生成相应的数据库操作代码。