概念
在运行期间动态的创建接口的实现。
通过生成的代理类,可以完成对接口的实现。
关键类和接口
处理接口方法的接口 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的方法拦截器