基于反射机制
代理: A类访问B类,但A类不能直接访问B类。可以建立C类,A类访问C类,C类访问B类,C类就是代理 //A:客户 B:目标 C:代理
代理模式作用:1.功能增强 2.控制访问
静态代理:代理类是手工实现的,目标类是确定的 //实现简单、便于理解
- 创建接口,定义好目标类和代理类的功能
- 创建目标类、代理类,实现接口
- 创建客户类,调用代理类的方法
缺点:当目标增加了,代理类可能也需要对应增加,代理类数量过多。接口增加方法,会影响到众多的实现类(代理类、目标类)
动态代理:在程序执行过程中使用JDK的反射机制,创建代理类对象,动态指定要代理的目标类 //动态:在程序运行时(运行阶段)
( 是一种创建Java对象的能力,能够不创建代理类就能创建出代理类对象)
优点:当目标类数量很多,代理类数量也可以很少。增加了接口的方法,也不会影响代理类方式:
1)JDK动态代理:使用Java反射包中的类和接口实现动态代理功能 //要求:必须有接口
2)CGLIB动态代理:CGLIB是第三方工具库。是通过继承目标类,重写子类的方法来实现功能的修改 //要求:父类和方法不能是final
JDK动态代理
遇到的类(反射包中的):Method
InvocationHandler接口 //调用处理器
方法:public Object invoke(Object proxy, Method method, Object[] args) //代理对象要执行的功能代码,即:调用目标方法、功能增强
//该方法不需要我们显示调用
参数 proxy:jdk创建的动态代理对象
method:目标类中的方法的类对象
args:目标类中方法的参数
Proxy:创建代理对象的类 //之前创建对象用new
静态方法:public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) // 创建并返回代理动态对象
参数 loader:目标对象的类加载器,负责向内存中加载对象 //可以通过反射获得类加载器
interfaces:目标对象的类所实现的接口类对象 //也是通过反射获取
h:InvocationHandler接口的实现类的对象 //代理的功能代码
实现步骤
- 创建接口,定义目标类要完成的功能。创建目标类,实现接口,创建目标类对象。
- 创建InvocationHandler接口的实现类,在invoke方法中完成代理的功能,利用构造方法创建出其对象
- 调用目标方法: method.invoke(目标类对象,参数)
- 增强功能
- 实现类中实现用构造方法传入目标对象并赋值给私有属性 //这样method.invoke(目标类对象,参数) 的目标对象就能使用了
- 使用Proxy类的静态方法newProxyInstance创建代理对象,并把返回值转为接口类型
- 调用代理对象,执行方法 //会根据方法名----method参数(即:方法类对象),实参----method.invoke(实参)的实参----method.invoke(实参)的实参---args参数(即:目标类方法的参数)
动态代理
最新推荐文章于 2024-07-06 13:18:20 发布