读JDK动态代理(源码)有感
先举个生活场景帮主大家消化一下:
假定我有一家 SUN公司的小型无人机,飞机有2个 操作 (起飞,下降)。由于由于飞机起飞的时候逼格不够,我希望飞机起飞的时候能放首歌《最炫民族风》。而我只是个月薪3000千的洗剪吹,不会改造这个高科技。那么我交给了一个想赚外快的大学毕业生(物联网工程专业的)。然后他要我提供三样东西:
- 飞机设计图
- 飞机实物
- 我那个带有《最炫名族风.avi》小米MP3智能播放器。
- 我的《需求文档》。
我把4分资料给了他,他就开始给我改造了。
过几天我便拿到了我要的《真·装逼无人机第二代》
然后我们可以把JDK的各个类对号入座了:
- classLoader 对应【飞机设计图】
- 构造InvocationHandler的target成员,也就是被代理对象 对应【飞机实物】
- 代理逻辑(写在invoke()方法里面的拦截逻辑) 对应【带有《最炫名族风.avi》小米MP3智能播放器。】
- InvocationHandler的invoke方法 对应【《需求文档》】
- 赚外快的大学生相当于Proxy.newProxyInstance()方法
- 《真·装逼无人机第二代》 相当于 实现target.getClass().getInterfaces()的Proxy实例对象
JDK动态代理流程
用户编辑invoke(),写入代理业务逻辑。
然后将【InvocationHandler,classLoader,还有被代理的接口数组】传入Proxy.newProxyInstance(),Proxy.newProxyInstance()中的【代理生成器】构造代理对象。
【代理生成器】具体构造步骤
- 通过target获取类名和接口名。
- 之后通过class.forName(classNameStr).getMethod(methodNameStr)获取【被代理对象的原方法实现】.
- 然后在实现【代理方法 (代理对象) 】的时候调用invoke(sourceMethod),并把原方法实现传入invoke(sourceMethod)。
最终完整了proxy构造由InvocationHandler.getProxy()返回。