概要: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






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
网友评论