1,.Java文件→.class文件→类加载器→Java虚拟机进行解释编译→由操作系统调用,到底层硬件
2,典型的静态代理:继承一个类,对其实现方法进行增强,在增强现有业务方面有很大的优点,但是大量使用这种静态代理会使得系统内部的类的规模增大,不容易维护;而且代理和对象本质上是相同的,系统结构就会很臃肿
3,动态代理:运行的时候,根据需要动态的创建一个代理,用完之后就销毁,可以避免代理角色的class在系统中冗杂的问题
动态代理本质上是在调用原来方法前后做一些额外的业务,将这个触发的动作交给invocation handler。这种模式中,代理和源对象应该实现相同的功能。有两种方式,第一是JDK,定义一个功能接口,然后两者都实现这个接口;第二是Cglib,通过继承
JDK的动态代理创建机制-通过接口
为某个类创建一个动态代理对象的时候
- 获得这个类的所有接口列表
- 根据要实现的接口信息,在代码中动态的创建代理类的字节码
- 将对应的字节码换成对应的class对象
- 创建InvocationHandler来实例化Handler,来处理代理所有的方法调用
- 代理的字节码对象以创建的Handler对象为参数,实例化一个代理对
Cglib生成动态代理类的机制-通过类继承
Cglib() code generation library是一个code生成类库,可以在运行期扩展Java类,实现Java接口
实现原理:
1,查看某个类上所有的非final的public类型的方法定义
2,将这些方法的定义转换为字节码
3,将组成的字节码转换成对应的代理的class对象
4,实现MethodInterceptor接口,用来处理对代理类上所有的方法请求(和InvocationHandler的功能和角色一样)