zoukankan      html  css  js  c++  java
  • Java动态代理机制

    1,.Java文件→.class文件→类加载器→Java虚拟机进行解释编译→由操作系统调用,到底层硬件

    2,典型的静态代理:继承一个类,对其实现方法进行增强,在增强现有业务方面有很大的优点,但是大量使用这种静态代理会使得系统内部的类的规模增大,不容易维护;而且代理和对象本质上是相同的,系统结构就会很臃肿

    3,动态代理:运行的时候,根据需要动态的创建一个代理,用完之后就销毁,可以避免代理角色的class在系统中冗杂的问题

      动态代理本质上是在调用原来方法前后做一些额外的业务,将这个触发的动作交给invocation handler。这种模式中,代理和源对象应该实现相同的功能。有两种方式,第一是JDK,定义一个功能接口,然后两者都实现这个接口;第二是Cglib,通过继承

       JDK的动态代理创建机制-通过接口

    为某个类创建一个动态代理对象的时候

    1. 获得这个类的所有接口列表
    2. 根据要实现的接口信息,在代码中动态的创建代理类的字节码
    3. 将对应的字节码换成对应的class对象
    4. 创建InvocationHandler来实例化Handler,来处理代理所有的方法调用
    5. 代理的字节码对象以创建的Handler对象为参数,实例化一个代理对

     

     Cglib生成动态代理类的机制-通过类继承

    Cglib() code generation library是一个code生成类库,可以在运行期扩展Java类,实现Java接口

    实现原理:

      1,查看某个类上所有的非final的public类型的方法定义

      2,将这些方法的定义转换为字节码

      3,将组成的字节码转换成对应的代理的class对象

      4,实现MethodInterceptor接口,用来处理对代理类上所有的方法请求(和InvocationHandler的功能和角色一样)

  • 相关阅读:
    MyBatis总结六:resultMap详解(包含多表查询)
    MyBatis总结五:#{}和${}的用法和区别
    MyBatis总结四:配置文件xml详解
    MyBatis使用动态代理报 invalid bound statement (not found) 错
    MyBatis总结三:使用动态代理实现dao接口
    MyBatis总结二:增删改查
    session详解&和cookie的区别
    cookie详解
    C#属性器Get和Set
    ORM实例介绍
  • 原文地址:https://www.cnblogs.com/benbenzoule/p/13839072.html
Copyright © 2011-2022 走看看