手写JDK动态代理--面试的杀手锏

1.静态代理

静态代理分为两类:继承和聚合
1.1继承:代理和目标对象是相对的,我们将代理对象当成目标对象,这样形成一个代理链。他的缺点:如果有一个新的需求将要增加类,将会造成类爆炸;代理链的顺序不好调节,如果要改变代理就得重构对象。
1.2聚合:在代理对象中设置被代理对象,这样在初始化代理对象的时候,将被代理对象设置给代理对象。如果每个代理对象都继承一个接口(也可以不用),就可以在代理对象设置接口对象。这样所有的代理对象就是一个类型(类似装饰模式,但是比装饰模式更加灵活)。就可以随意组合使用。但是他还是有个缺点:没有一个需求还是重新构建一个对象,这样还是会造成类爆炸。

2.JDK动态代理原理

InvokeHandler接口中定义代理的逻辑,生成的代理类中,定义InvokeHandler接口对象,去调用InvokeHandler实现类的具体方法。Proxy工具类只是构建了一个调用InvokeHandler方法的一个代理类,生成代理对象的时候将InvokeHandler作为一个参数注入到代理对象中。
jdk动态代理并没有去生成.class文件,来读取文件,进行编译,而是直接生成class的二进制的字节,然后创建对象,因为IO流是一个软件性能核心体现。他最终调用 native方法,用C或者c++去实现生成class文件的方法。

3.手写JDK动态代理的思路

3.1.手动构建一个代理的类,是由java字符串构成;
设计思想,将需要将原方法增强的方法,放在一个接口的实现类中(InvokeHandler),在动态类中定义
接口类,当作代理类的构造参数,代理类相当于一个模板,具体动态增强的方法由我们自己定义,这就是面
向抽象的精髓所在。
3.2.将字符串重新编译为一个class文件,放在目录下。
3.3.动态的加载class文件。
自定义一个classLoader加载class文件。
3.4.实例化代理对象进行返回
反射调用有参构造器,擦换入Invoke实现类,实例代理对象,进行返回

4.手写JDK动态代理的步骤

创建代理增强的接口;在这里插入图片描述
自定义加载class文件的classLoader
在这里插入图片描述
在这里插入图片描述
创建动态代理的工具类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接口类:
在这里插入图片描述
被代理类:
在这里插入图片描述
实现CWInvokeHandler接口
在这里插入图片描述
测试类:
在这里插入图片描述
大功告成,让我们看下输出的结果:
在这里插入图片描述

发布了2 篇原创文章 · 获赞 2 · 访问量 106

猜你喜欢

转载自blog.csdn.net/weixin_43922880/article/details/104600214