5.1.2 动态代理

跟静态代理不同的是,动态代理的代理类是在运行时生成的。也就是说,动态代理类在程序运行时由Java反射机制动态生成,我们无须编写代理类的代码。

实现动态代理的步骤:

(1)定义一个委托类和公共接口。

(2)实现InvocationHandler接口,创建代理类的调用处理器。

(3)动态生成代理对象。

(4)通过代理对象调用方法。

动态代理会涉及两个重要的Java API:

(1)java.lang.reflect.Proxy:是Java动态代理机制生成的所有动态代理类的父类,提供了一组静态方法来为一组接口动态地生成代理类及其对象。

(2)java.lang.reflect.InvocationHandler:是调用处理器接口。它的invoke方法用于集中处理在动态代理类对象上的方法调用,通常在该方法中实现对委托类的代理访问。

我们先小结一下静态代理和动态代理的优缺点:

· 静态代理在编译时产生class字节码文件,效率高。但是静态代理只能为一个目标对象服务,如果目标对象过多,就会产生很多代理类。

· 动态代理必须实现InvocationHandler接口,通过反射代理方法,比较消耗系统性能。但是动态代理可以减少代理类的数量,使用更灵活。Java后端的很多框架大多采用这种方式。