zoukankan      html  css  js  c++  java
  • Java动态代理设计模式

    主要介绍Java中两种常见的动态代理方式:JDK原生动态代理和CGLIB动态代理。

    什么是代理模式
    就是为其他对象提供一种代理以控制对这个对象的访问。代理可以在不改动目标对象的基础上,增加其他额外的功能(扩展功能)。

    代理模式角色分为 3 种:

    Subject(抽象主题角色):定义代理类和真实主题的公共对外方法,也是代理类代理真实主题的方法;
    RealSubject(真实主题角色):真正实现业务逻辑的类;
    Proxy(代理主题角色):用来代理和封装真实主题;
    如果根据字节码的创建时机来分类,可以分为静态代理和动态代理:

    所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和真实主题角色的关系在运行前就确定了。
    而动态代理的源码是在程序运行期间由JVM根据反射等机制动态的生成,所以在运行前并不存在代理类的字节码文件

    静态代理的问题
    如果我们需要计算SDK中100个方法的运行时间,同样的代码至少需要重复100次,并且创建至少100个代理类。往小了说,如果Cat类有多个方法,我们需要知道其他方法的运行时间,同样的代码也至少需要重复多次。因此,静态代理至少有以下两个局限性问题:

    如果同时代理多个类,依然会导致类无限制扩展
    如果类中有多个方法,同样的逻辑需要反复实现
    所以,我们需要一个通用的代理类来代理所有的类的所有方法,这就需要用到动态代理技术。

    动态代理实现过程
    通过getProxyClass0()生成代理类。JDK生成的最终真正的代理类,它继承自Proxy并实现了我们定义的接口.
    通过Proxy.newProxyInstance()生成代理类的实例对象,创建对象时传入InvocationHandler类型的实例。
    调用新实例的方法,即原InvocationHandler类中的invoke()方法。
    代理对象不需要实现接口,但是目标对象一定要实现接口,否则不能用动态代理

  • 相关阅读:
    推荐Windows下SVN服务器端和客户端工具软件
    QT的一些小知识
    Qt
    Qt
    ADB
    HTTP
    Python
    项目附
    项目
    架构
  • 原文地址:https://www.cnblogs.com/chen991126/p/14092696.html
Copyright © 2011-2022 走看看