动态代理介绍:
作用:
功能增强:代理可以提供额外的功能
控制访问:代理可以控制不让你访问目标
分类:
静态代理:简单容易理解
例如模拟用户购买U盘的行为
用户是客户端,商家是代理,厂家是目标类
客户端--代理--目标(工厂)类
分析:
代理中实现目标类的时候一定会调用目标类的方法,因为代理类本身没有目标类的方法,只有访问目标类才能实现客户对目标类的访问请求
接口定义需要做的事情 ,代理类和目标类都要对接口进行实现并且一定会调用工厂类的方法,客户类调用代理类实现接口功能
缺点:
1.工厂类可能不只有一个,但是当代理类使用静态代理会随着目标类的增加而增加
2.若目标类进行改动,则会导致所有实现目标接口的代理类都会需要重写
所以引入了动态代理....
动态代理:
当目标类很多时,借助动态代理可以解决代理类数量过多以及接口改动对于代理类的影响
在程序的执行该过程中使用jdk的反射机制创建代理类对象并且动态制定需要代理的目标类(略过了省去创建代理类,直接使用代理类对象)
分析:
JDK动态代理:使用java反射包java.long.reflect实现(要求必须有接口)
1.重写InvocationHandler接口中的invoke方法,作为代理功能的实现
3.通过java.lang.reflect.Proxy中的newProxyInstance()获得目标类的代理对象
参数:
ClassLoader loader 类加载器
类<?>[] interfaces 目标类的接口
InvocationHandler h 自己重写的代理类要完成的功能
CGLIB动态代理:使用第三方工具库,使用继承目标类在子类中重写父类方法(能继承就可以,不能是final修饰)