一、什么是动态代理
A调用B,但不直接调用,A通过调用C,C再调用B,C在调用B的前后可以做一些自己的事情,比如说打日志、权限验证等,这样就把业务代码与系统代码分开,同时减少了A和B之间的耦合。
动态代理的经典应用是Spring AOP
二、动态代理作用
最终是学习AOP(面向切面编程),它与装饰者模式优点相似,它比装饰者模式还要灵活
三、动态代理方法
Object proxyObject = Proxy.newProxyInstance(ClassLoader classLoader,Class[] interfaces,InvocationHandler h);
方法作用:动态创建实现了interface数组中所有指定接口的实现类对象
参数:
1.ClassLoader:类加载器!它是用来加载类的,把.class文件加载到内存中,形成Class对象
2.Class[] interfaces:指定要实现的接口们
3.InvocationHandler:代理对象的所有方法(个别不执行,getClass)都会调用InvocationHandler的invoke()方法
public Object invoke(Object proxy,Method method,Object [] agrs);
//这个invoke()方法在什么时候被创建!在调用代理对象所实现接口中的方法时
参数:
Object proxy //当前对象,即代理对象!(即在调用谁的方法)
Method method //当前被调用的方法(目标方法)
Object [] args //实参
四、增强
增强的手段:
1.继承
被增强对象不能变
增强内容不能变
2.装饰者模式
被增强对象能变
增强内容不能变
3.动态代理
被增强对象能变
增强内容 能变
目标对象:被增强的对象
代理对象:需要目标的对象,然后在目标对象上添加了增强后的对象
目标方法:增强的内容
代理对象=目标对象+增强