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()方法。
    代理对象不需要实现接口,但是目标对象一定要实现接口,否则不能用动态代理

  • 相关阅读:
    HDU 2089 不要62
    HDU 5038 Grade(分级)
    FZU 2105 Digits Count(位数计算)
    FZU 2218 Simple String Problem(简单字符串问题)
    FZU 2221 RunningMan(跑男)
    FZU 2216 The Longest Straight(最长直道)
    FZU 2212 Super Mobile Charger(超级充电宝)
    FZU 2219 StarCraft(星际争霸)
    FZU 2213 Common Tangents(公切线)
    FZU 2215 Simple Polynomial Problem(简单多项式问题)
  • 原文地址:https://www.cnblogs.com/chen991126/p/14092696.html
Copyright © 2011-2022 走看看