浅谈动态代理的个人思考和理解

前言

这篇文章主要谈的是自己各种反复学习的过程中,目前的一个思想和认知的总结,个人也很烦把写博客当成水经验的,和水论文数量的大部分人。我的内容基本是一个东西认知的思想精华和总结,基本不含代码,因为作者在学习阶段,代码和初学者的水平高不了一个等级,市面上有关动态代理的代码很多,能读我文章的人,也默认其有一定基础,但是好像又对这个东西模模糊糊,这类读者收获应该是最大的。
什么是动态代理
所谓动态代理就是,把一些类似于重复的日志,时间等大量重复的代码,利用切面的思维方式,提取出来,做成一个加工包装的工具,在要使用实际对象的时候,用这个东西给包装一下再展示,发给消费者,而不是把包装一起给消费者,等他们自己一个个的包装,这样为每一个消费者省了一些麻烦,做出来的东西好评率也更高不是吗?
动态代理实现的关键
感觉大部分对动态代理模模糊糊的认知的,一般是知道动态代理是什么的一个,也能手写一个简单动态代理的实现,但是实现的过程和逻辑总是有些模糊,中间的代理类和那些方法说不清楚,实际问题出现的时候,绕着绕着大概感觉自己就分不清东南西北的。好了,现在开始进入正题。还是基于默认读者能手写一个动态代理的简单实现。
首先从Proxy.newInstance()这个方法开始讲。Proxy一个代理类,方法的意思生成一个代理类的实例,毕竟我们是要用这个代理类来达到包装的效果。现在来说这个方法的三个参数,第一个参数是类加载器。感觉好像是个类加载器就行,这里可能是用到双亲委派的知识,目前我暂时不能说清楚,但只要知道是个类加载器就行,我一般就用当前类的类加载器,第二个参数是接口的类对象,毕竟我们的目的就是要把接口的方法取出来作为外包装嘛。很明显就是用第一个参数的类加载器去加载接口的类对象,从而获得接口的方法,这个就是反射的实现中,虚拟机的第一部分操作。反射的知识和部分虚拟机的东西,我暂且不细说,毕竟当前主要说的是动态代理。在Proxy.newInstance()这个方法的源码中,可以发现前两个参数主要是用来生成真正的代理类(一个金钱符号,打不出来这一行字就怪怪的)Proxy0,我目前也不知道为啥是这个样子,先不管嘛,无关紧要。这个代理类,它继承了Proxy代理类,还扩展了第二个参数代表的接口,最重要的一点是,它的一个属性是Proxy.newInstance()这个方法第三个参数,实现InvocationHandler接口的类。这个构成不要太奇妙,想必我说清楚了这个,大部分人应该渐渐很清晰了。整个动态代理最为关键和最难理解就是这个代理类的巧妙构造,一旦认清它的本来面目,基本就不会又什么疑惑的地方了。参数已经解释完毕了,那么还剩下返回了,Proxy.newInstance()返回的就是这个真正的代理类的对象,通过查看的对象的class对象确实是$Proxy0,这个对象即继承了代理类,又实现了接口,所以能调用接口的方法,还含实现了InvocationHandler接口的类的一个属性,因为这个属性不是静态的,所以生成对象的时候不用初始化,这个在我另外一篇博客中详细阐述过了。但是,这个对象如果调用接口的方法的话,则会初始化类的所有属性,然后触发invocationHandler的invoke方法,方法参数第一个是真实的代理类,第二个是接口的class对象的属性之一的方法对象,这个牵扯java虚拟机和反射,这里不细说,第三个是接口方法的参数。
在invoke方法内,因为参数带有接口的class对象的属性之一,也就是接口的方法对象,通过这个对象,即可使用method.invoke方法反射实现了接口的方法,然后实现对接口方法的调用。返回一个object类的对象。

结语

后面部分其实牵扯到的是虚拟机和反射,已经不是这部分的主要内容,如果有疑惑的地方,可以留言联系,因为我个人觉得这个部分主要讲清楚Proxy.newInstance()方法生成的是什么样的对象,和是怎么生成的对象就差不多。后面的反射和虚拟机的部分,我想单独作为一章,和mybatis的原理一起讲解。

补充

这里的类加载器,是AppClassLoader,app类加载器,也叫系统类加载器。所谓双亲委派机制就是,当加载一个类的时候,会先去找其父类的加载器,如果父类加载器能加载,则加载完返回,如果父类不能加载,则依次向下到尝试本类的加载器去加载。最顶层的类加载器为引导类加载器,是用C语言写的,主要加载Java的核心库类,在Java中尝试获取的时候,返回为空,接下来他的子类加载器为扩展类加载器,接着子类是App类加载器。除了引导类加载器,其他的类加载都是直接或间接继承与抽象类classloader。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值