目录
1 动态代理
1.1 常见的代理介绍
1,ASM:
可直接对字节码文件进行修改,也可生成字节码,开发者要掌握字节码结构以及更为底层的指令https://asm.ow2.io/
2,cglib:
基于ASM,Spring AOP也可以使用它,其原理是动态生成一个要代理类的子类
github:https://github.com/cglib/cglib
3,bytebuddy:
也是基于 ASM API 实现的,是一个较高层级的抽象的字节码操作工具,通过使用Byte Buddy,任何熟悉 Java 编程语言的人都有望非常容易地进行字节码操作站点:https://bytebuddy.net/#/ 看官方文档介绍可以很快的上手
官方文档介绍 helloword案例,
4,Javassist:
增强字节码时直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构或者动态生成类
github:https://github.com/jboss-javassist/javassist
1.2 动态代理在rpc中的作用
RPC框架在初始化的时候会在客户端这一侧,会为我们的接口生成代理的实现并注入到指定的位置
当我们在项目中注入接口的时候,运行过程中实际绑定的是这个接口生成的代理类。
当我们在客户端这一侧调接口方法的时候,会优先走到代理的实现类中在代理实现类中底层包装网络调用相关逻辑在接口方法被调用的时候,它实际上是被生成代理类拦截到了,这样
我们就可以在生成的代理类里面,加入远程调用逻辑。
动态代理在rpc中很大的作用就是屏蔽,向上屏蔽底层的细节,让我们上层开发者只需要调接口方法即可。
1.3 JDK Proxy动态代理的相关概念
JDK Proxy,是基于接口动态代理
提供者: JDK官方
要求:被代理类最少实现一个接口
1.4 Proxy动态代理的实现原理
方法的参数介绍:
ClassCloader 类加载器。加载代理对象字节码的和被代理对象使用相同的类加载器它是固定的。
代理谁就使用谁的类加载器。
Class[] 字节码数组。
让代理对象和被代理对象具有相同的方法 (行为)
写的被代理对象实现的接口数组。
被代理对象是一个类:
被代理对象.getClass ().getInterfaces();
被代理对象是一个接口:
new Class]{被代理对象}
InvocationHandler 一个接口。
用于提供增强代码的.
增强的代码谁用谁写。
提供一个InvocationHandler接口的实现类,在实现类中提供增强的代码通常我们会用匿名内部类,但不绝对。
传入InvocationHandler的实例,代理的拦截面当我们调用 newProxyInstance方法传递完参数的时候,就会给我返回一个接口的实现类,就是代理实现类当我们在调用代理实现类某一个方法的时候,他会优先走到InvocationHandler中的invoke方法。
invoke方法参数介绍:
Object proxy:生成的代理类对象
Method method:代理类对象执行方法的方法的字节码对象
Object[] args:代理类对象执行方法的方法传入的参数数组
InvocationHandler 之所以往他叫代理的拦截面是有原因的,在InvocationHandler 的 invoke方法中拦截到 这次方法的调用,在invoke内部就可以包装底层的一系列复杂的逻辑。
JDK Proxy,动态代理原理:
根据生成的代理类源码分析
去看生成的源码代理类的代理类的源码,屡屡源码就明白他的执行 原理了。
总结 2
动态代理在rpc中很大的作用就是屏蔽,向上屏蔽底层的细节,让上层开发者只需要调接口方法即可。