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的功能和角色一样)

原文地址:https://www.cnblogs.com/benbenzoule/p/13839072.html