• 代理模式一篇拿捏


    目录

    一,代理模式:

    1,代理模式的作用:

    2,代理的分类:

    二,静态代理:

    特点:

    4,静态代理执行流程:

    5,面向接口编程:

    三,动态代理

    动态代理:

     一),JDK动态代理

    1,JDK动态代理的常用工具类

    1),Proxy(代理)类

    产生JDK动态代理的方法:

    2),Method类:

    3),InvocationHandler(调用代理)接口

    2,代码实现

     二),CGLib动态代理(又称子类)


    一,代理模式:

    目标对象不可访问,通过代理对象增强功能访问,实现访问目标对象。如:租房子,需要通过房屋中介来实现租房。目标对象:房东,代理对象:中介,客户端对象:租客。

    1,代理模式的作用:

    1)控制目标对象的访问

    2)增强功能

    2,代理的分类:

    1),静态代理

    2)。动态代理

            a,JDK动态代理

            b,CGLib动态代理

    二,静态代理:

    代理模式的一种,

    特点:

    1)目标对象和代理对象实现同一个业务接口

    2),目标对象必须实现接口

    3),代理对象在运行前就已经存在

    4),能够灵活切换目标对象,无法进行功能的灵活处理(使用动态代理处理)

    4,静态代理执行流程:

    5,面向接口编程:

    1,内部成员属性定义为接口类型,2,方法的返回值定义为接口,3,方法的参数定义为接口 

    三,动态代理

    动态代理:

    灵活的进行功能切换的要求

    静态代理:能够灵活切换目标对象,却无法进行功能的灵活处理所以要使用使用动态代理处理

    代理对象在程序运行时动态在内存构建,可以灵活的进行业务切换。

     一),JDK动态代理

                    a,目标对象必须实现业务接口

                    b,JDK代理对象不需要实现业务接口

                    c,JDK动态代理的对象,在程序运行前不存在,在程序运行时,动态的在内存构建

                    d,JDK灵活的进行任务切换。

                    e,本类中的自己的方法,不可以被代理

    1,JDK动态代理的常用工具类

    1),Proxy(代理)类

    java.lang.reflect.Proxy包下的类

    产生JDK动态代理的方法:

    Proxy.newProxyInstance(.....)

    newProxyInstance(...)的参数解读:

     ClassLoader://类加载器

    Class[] :目标对象实现的全部接口

    InvocationHandler:代理的功能和目标对象业务的实现都在该接口下的实现类中

    2),Method类:

    反射用的类,用来进行对目标对象的方法的反射调用。

    method.invoke();//调用方法

    3),InvocationHandler(调用代理)接口

    实现代理的功能和调用目标对象重写接口的方法,使用匿名内部类来实现

    2,代码实现

    业务接口:

    1. public interface Service {
    2. void buy();
    3. String getName(String name);
    4. }

    目标对象1:

    1. public class Women implements Service {
    2. @Override
    3. public void buy() {
    4. System.out.println("买小裙子。。。。");
    5. }
    6. @Override
    7. public String getName(String name) {
    8. System.out.println(name);
    9. return name;
    10. }
    11. }

    目标对象2:

    1. public class Man implements Service {
    2. @Override
    3. public void buy() {
    4. System.out.println("买包华子。。。");
    5. }
    6. @Override
    7. public String getName(String name) {
    8. return name;
    9. }
    10. }

    代理工厂:程序运行时动态的创建代理对象

    1. public class ProxyFactory {
    2. Service service;
    3. public ProxyFactory(Service service){
    4. this.service = service;
    5. }
    6. //获取JDK动态代理对象
    7. public Object getAgent(){
    8. return Proxy.newProxyInstance(
    9. service.getClass().getClassLoader(),//获得目标对象的类加载器
    10. service.getClass().getInterfaces(),//获得目标对象的实现的所有接口
    11. new InvocationHandler() {//动态代理对象的功能
    12. @Override
    13. public Object invoke(
    14. Object proxy,//创建动态代理对象
    15. Method method,//代理对象需要调用的方法
    16. Object[] args//目标方法的参数
    17. ) throws Throwable {
    18. //代理功能
    19. System.out.println("去商场");
    20. //目标对象功能,args是方法运行需要的参数
    21. Object invoke = method.invoke(service, args);
    22. //代理功能
    23. System.out.println("买到了");
    24. return invoke;//返回目标方法的返回值
    25. }
    26. }
    27. );
    28. }
    29. }

    测试:

    1. public static void main(String[] args) {
    2. Service service = new Women();
    3. //这里不能传入实现类的匿名对象,需要先将实现类的类型提升为接口,在将替身后的对象传入,否则会出现类型转换异常
    4. ProxyFactory factory = new ProxyFactory(service);
    5. Service agent = (Service) factory.getAgent();
    6. //这里得到的对象类型是:class com.sun.proxy.$Proxy0
    7. System.out.println(agent.getClass());
    8. //因为他是Proxy类型的对象,所以除了这个接口的方法,实现类自己的方法是无法通过该对象来调用的
    9. agent.buy();
    10. agent.getName("张三");
    11. }

     二),CGLib动态代理(又称子类)

    通过动态的在内存中构建子类对象,重写父类的方法,进行代理功能的增强

    即在实现类没有实现接口时,通过CGLib子类代理来进行功能加强。(有点像继承)

  • 相关阅读:
    [Spring实战] 整合Spring/SpringMVC/Mybatis(SSM)实现登录功能(带前端)
    sqlite3 drop table 大数据库,耗时很长(相关搜索:数据库)
    SECS/GEM半导体协议介绍
    websocket实现go(server)与c#(client)通讯
    google abseil c++ Tip of the Week #65: Putting Things in their Place 把对象放入容器的方式
    颠覆者:Telegram 凭借源自中国的云基础设施成为超级应用
    coco数据集解析及读取方法
    Golang那些违背直觉的编程陷阱
    java毕业设计成品源码网站javaweb企业财务|记账|账单管理系统
    图像变视频
  • 原文地址:https://blog.csdn.net/qq_52655865/article/details/126315457