您的位置:首页 > 编程语言 > Java开发

读JDK动态代理(源码)有感

2016-10-10 19:11 134 查看

读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()返回。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态代理 jdk