(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

1业务接口
2业务实现类target
3业务处理类Handler

3、$Proxy0

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

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

最终回调Handler的invoke完成调用

二、手写动态代理

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

1、自定义InvocationHandler:

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

3、自定义类加载器MyClassLoader:

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

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

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

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

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

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

5其他

1)MyProxy的其他方法 编译:

2)getMethodString方法

3)运行结果

4)生成的$MyProxy0:

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

推荐阅读更多精彩内容