手写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接口
在这里插入图片描述
测试类:
在这里插入图片描述
大功告成,让我们看下输出的结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值