动态代理是基于反射机制的
1.什么是动态代理
1.什么是代理
假设有个A类需要调用C类的方法来完成某个功能,但C类不允许A类调用,
那么在A和B之间创建一个B代理,B可以访问C,则A访问B,B访问C,C返回信息给B,B给A
2.代理的作用
1.功能增强:在原有功能上,增加了额外功能,新增加的功能,叫做功能增强
2.控制访问:代理类不让客户直接访问目标
3.实现代理的方式
1.静态代理: 1)代理类是自己手动实现的,自己创建一个java类,表示代理类,
2)同时你所要代理的目标类是固定的
特点:1)实现简单,2)容易理解
缺点:1)目标类增加,代理类也会增加;
2)在接口中增加方法,所有实现这个接口的类都需要修改
模拟用户买U盘行为
用户:客户端类
商家(代理):代理商
厂家:目标类
实现步骤:
1.创建一个接口,定义卖U盘的方法,表示厂家和商家的事情
2.创建厂家,实现1步骤接口
3.创建商家,就是代理,也需要实现1步骤中的接口
4.创建客户端类,调用商家的方法买一个U盘
代理类完成的功能:
1.目标类中方法的调用
2.功能增强
2.动态代理:
在静态代理中目标类很多时,可以使用动态代理,避免静态代理的缺点。
动态代理中目标类即使很多,1)代理类数量可以很少,2)当修改了接口中的方法时,不会影响代理类
如何使用动态代理:
在程序执行的过程中,使用jdk的反射机制,创建代理类对象,并动态指定要代理的目标类。
换句话说,动态代理是一种创建java对象的能力,让你不用创建taobao类,就能创建代理类对象
在java中,要想创建对象:
1.创建类文件,java文件编译为class
2.使用构造方法,创建类的对象。
4.什么是动态代理
使用jdk反射机制,创建对象的能力,创建的是代理类的对象,而不用你创建类文件,不用写java文件。
动态:在程序执行时,调用jdk提供的方法才能创建代理类对象
5.动态代理的实现
1.jdk动态代理:使用java反射包中的类和接口实现动态代理的功能
java.lang.reflect,里面有三个类:InvocationHandler,Method,Proxy
2.cglib动态代理:cglib(Code Generation Library)是第三方的工具库,创建代理对象。
cglib的原理是继承,cglib通过继承目标类创建它的子类。在子类中重写父类同名的方法,
实现功能的修改。
因为cglib是继承,重写方法,所以要求目标类不能是final的,方法也不能是final的。
2.jdk反射机制
1.反射,Method类,表示方法。类中的方法。通过Method可以执行某个方法
2.jdk动态代理的实现
反射包java.lang.reflect,里面有三个类,Method,InvocationHandler,Proxy
1)InvocationHandler接口(调用处理器),就一个方法invoke()
invoke()表示代理对象要执行的功能代码
2)Method()执行某个目标类的方法,Method.invoke()
3)Proxy类:创建代理对象。之前创建对象都是new对象,用Proxy代替new
方法:静态方法 newProxyInstance()
作用:创建代理对象
参数:
1.ClassLoader 类加载器,负责向内存中加载对象。使用反射机制获取对象ClassLoader
例如对于类A,A.getClass().getClassLoader() 目标对象的类加载器
2.Class<?> interfaces:接口,目标对象实现的接口妈也是反射获取的
3.InvocationHandler h:程序员编写,代理类要完成的功能
返回值:就是代理对象
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
3.实现动态代理的步骤
1.创建接口,定义目标类要完成的功能
2.创建目标类实现接口
3.创建InvocationHandler接口的实现类,在invoke方法中完成代理类的功能
1.调用目标方法
2.功能增强
4.使用proxy类的静态方法创建代理对象,并把返回值转为接口类型