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

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


先举个生活场景帮主大家消化一下

假定我有一家 SUN公司的小型无人机,飞机有2个 操作 (起飞,下降)。由于由于飞机起飞的时候逼格不够,我希望飞机起飞的时候能放首歌《最炫民族风》。而我只是个月薪3000千的洗剪吹,不会改造这个高科技。那么我交给了一个想赚外快的大学毕业生(物联网工程专业的)。然后他要我提供三样东西:

  1. 飞机设计图
  2. 飞机实物
  3. 我那个带有《最炫名族风.avi》小米MP3智能播放器。
  4. 我的《需求文档》。

我把4分资料给了他,他就开始给我改造了。
过几天我便拿到了我要的《真·装逼无人机第二代》

然后我们可以把JDK的各个类对号入座了:

  • classLoader 对应【飞机设计图】
  • 构造InvocationHandler的target成员,也就是被代理对象 对应【飞机实物】
  • 代理逻辑(写在invoke()方法里面的拦截逻辑) 对应【带有《最炫名族风.avi》小米MP3智能播放器。】
  • InvocationHandler的invoke方法 对应【《需求文档》】
  • 赚外快的大学生相当于Proxy.newProxyInstance()方法
  • 《真·装逼无人机第二代》 相当于 实现target.getClass().getInterfaces()的Proxy实例对象

JDK动态代理流程

用户编辑invoke(),写入代理业务逻辑。
然后将【InvocationHandler,classLoader,还有被代理的接口数组】传入Proxy.newProxyInstance(),Proxy.newProxyInstance()中的【代理生成器】构造代理对象。

【代理生成器】具体构造步骤

  1. 通过target获取类名和接口名。
  2. 之后通过class.forName(classNameStr).getMethod(methodNameStr)获取【被代理对象的原方法实现】.
  3. 然后在实现【代理方法 (代理对象) 】的时候调用invoke(sourceMethod),并把原方法实现传入invoke(sourceMethod)。
    最终完整了proxy构造由InvocationHandler.getProxy()返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值