Java的动态代理(Dynamic Proxy)支持在运行时动态地生存代理类/对象。
Map proxy = (Map) Proxy.newProxyInstance(
this.getClass().getClassLoader(), // 指定class loader
new Class[] { Map.class }, // 生产的代理类所要实现的接口
new MyInvocationHandler()); // InvocationHandler对象
生产的代理类在一个class loader里只有一个。
对代理对象的所有方法调用都会经过InvocationHandler
的invoke
方法。
在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
在
接收到方法调用时可以解析方法名,然后生成相应的数据库操作代码。