有不懂的可以留言我,虽然我也很菜
动态代理概述及实现
动态代理概述
代理: 本来应该自己做的事情,请了别人来做,被请来做事的人叫做代理对象.
举例: 春节回家买不到车票请人代买,找房子懒得自己跑就通过中介找.
动态代理: 在程序运行过程中产生的这个代理对象,而程序运行过程中产生对象其实就是反射的内容,所以,动态代理就是通过反射来生成的一个代理.
在java中java.lang.reflect包下提供了Proxy类和InvocationHandler接口,通过使用这个类和接口可以生成动态代理对象,JDK提供的代理只能针对
接口
做代理,对类生成动态代理对象可以通过cglib,在spring那里有提到,我晚点写.创建动态代理对象流程:
- Proxy类中的方法: **public static Object newProxyInstance(ClassLoader loader, Class <?> [] interfaces, InvocationHandler h)**会生成动态代理对象,也就是参数中的接口的代理实例.
loader表示被代理对象的类加载器,首先我们要拿到代理对象的字节码文件对象,然后通过Class的静态方法
getClassLoader()
方法就可以得到类加载器了.interfaces表示被代理对象实现的接口.
- 最终会调用**InvocationHandler(它是由代理实例的调用处理程序实现的接口,也就是上面的h实现的接口)中的Object invoke(Object proxy, Method method, Object[] args)**方法,实现在代理实例上处理方法调用并返回结果,完成动态代理.
proxy这个参数是被代理对象,不是代理对象哈,比如我请人买票,我就是被代理对象,这里的proxy指的是我.
method参数表示要执行的方法,比如我请人买票,这个方法就是买票.
Object[] args表示method方法的参数,比如我请人买票,那么起始地址和到达地址就可以作为参数,如果method方法没有参数就不给就可以了.
我们在通过动态代理实现功能的时候,代理类要实现InvocationHandler这个接口并重写其invoke方法,这样才能作为调用处理程序来实现代理.