之前介绍的反射和注解都是Java中的动态特性,还有即将介绍的动态代理也是Java中的一个动态特性。这些动态特性使得我们的程序很灵活。动态代理是面向AOP编程的基础。通过动态代理,我们可以在运行时动态创建一个类,实现某些接口中的方法,目前为止该特性已被广泛应用于各种框架和类库中,例如:Spring,Hibernate,MyBatis等。理解动态代理是理解框架底层的基础。
主要内容如下:
理解代理是何意
Java SDK实现动态代理
第三方库cglib实现动态代理
一、代理的概念
单从字面上理解,代理就是指原对象的委托人,它不是原对象但是却有原对象的权限。Java中的代理意思类似,就是指通过代理来操作原对象的方法和属性,而原对象不直接出现。这样做有几点好处:
节省创建原对象的高开销,创建一个代理并不会立马创建一个实际原对象,而是保存一个原对象的地址,按需加载
执行权限检查,保护原对象
实际上代理堵在了原对象的前面,在代理的内部往往还是调用了原对象的方法,只是它还做了其他的一些操作。下面看第一种实现动态代理的方式。
二、Java SDK实现动态代理
实现动态代理主要有如下几个步骤:
实现 InvocationHandler接口,完成自定义调用处理器
通过Proxy的getProxyClass方法获取对应的代理类
利用反射技术获取该代理类的constructor构造器
利用constructor构造代理实例对象