(11)纯手写JDK动态代理

概要:1动态代理(过程 角色 Proxy0)    2手写(InvocationHandler 、2Handler实现、3类加载器、4MyProxy)

一、动态代理

1、过程

1)Proxy通过传递给它的参数(interfaces/invocationHandler生成代理类$Proxy0;

2)Proxy通过传递给它的参数(ClassLoader)来加载生成代理类$Proxy0字节码文件

2、角色

1业务接口Interface、2业务实现类target、3业务处理类Handler、4JVM在内存中生成的动态代理类$Proxy0

(11)纯手写JDK动态代理_第1张图片
(11)纯手写JDK动态代理_第2张图片
1业务接口
(11)纯手写JDK动态代理_第3张图片
2业务实现类target
(11)纯手写JDK动态代理_第4张图片
3业务处理类Handler
(11)纯手写JDK动态代理_第5张图片
(11)纯手写JDK动态代理_第6张图片

3、$Proxy0

(11)纯手写JDK动态代理_第7张图片

1)实现业务接口(Man),客户端可调接口方法

2)继承Proxy,通过构造方法将业务处理类传入给父类Proxy进行初始化。(Proxy中存在protected InvocationHandler h;)

最终回调Handler的invoke完成调用

(11)纯手写JDK动态代理_第8张图片

二、手写动态代理

1InvocationHandler 、2Handler实现、3类加载器、4MyProxy

(11)纯手写JDK动态代理_第9张图片

1、自定义InvocationHandler:

(11)纯手写JDK动态代理_第10张图片

2、实现MyInvocationHandler的业务处理Handler:

(11)纯手写JDK动态代理_第11张图片

3、自定义类加载器MyClassLoader:

自己在内存中生成动态代理类,加载

重写findClass,为在指定路径下加载指定字节码文件:

4、自定义MyProxy(当于JDK的Proxy):

1)根据interfaces接口构造动态代理类需要方法(利用反射获取)

2)动态生成代理类(.java)进行编译,生成字节码文件(.class),加载

3)实例化构造方法(反射机制),初始化业务Hanlder

(11)纯手写JDK动态代理_第12张图片

5其他

1)MyProxy的其他方法 编译:

(11)纯手写JDK动态代理_第13张图片

2)getMethodString方法

(11)纯手写JDK动态代理_第14张图片

3)运行结果

(11)纯手写JDK动态代理_第15张图片

4)生成的$MyProxy0:

https://www.jianshu.com/p/58759fef38b8

你可能感兴趣的:((11)纯手写JDK动态代理)