Java 代理模式的学习总结

最近在学mybatis框架用到了代理模式来实现对数据库的操作,所以又去回顾了一下代理模式,然后发现代理模式分为JDK代理和cglib代理,可以看看这篇博客分析了两种代理。JDK的被代理的对象需要实现一个接口,接口相当于功能,用功能概括类型,是面向接口编程,意思就是如果一个人有工作的这个功能,他就可以被概况为一个员工。实现了接口的实体类可以说是一个需要被代理的对象,然后JDK的代理模式分为静态代理和动态代理,静态代理就是再写一个实体类实现被代理对象相同的接口,然后可以对被代理对象实现的方法做出调整增强,比如我创建了某一个电影的实体类,然后再创建了一个电影院的实体类,然后电影院实体类就可以增强电影实体类的方法,比如可以拿着可乐来看电影,但是静态实现方式相当于固定死了被代理的对象,只能代理固定的对象,不够灵活,比如我还要代理卖电脑的商家,那么我就要创一个新的类了,那么动态代理的实现就比较符合我们的要求了,动态代理是在内存中形成代理类。
实现动态代理需要创建一个动态的代理对象,Proxy.newProxyInstance(xx,xx,xx)会返回一个代理对象代理对象可以强转为接口的类型,然后调用接口的方法,因为我们作为用户不需要知道你代理实现的原理,只需要知道你的功能是什么就行了,然后newProxyInstance里面需要三个参数:被代理的类加载器,接口和一个实现了InvocationHandler的实体类,这个实体类重写了invoke方法,是不是很熟悉,就是利用了反射机制,invoke方法也需要三个参数:一个是Object类型的对象proxy相当于代理对象,一个Method类型(代理对象调用了什么方法就会封装成什么方法),还有一个是数组类型的参数(代理对象调用某些方法传递的参数),只要你创建的代理对象调用了被代理对象的某一方法,再invoke里面就会根据反射获得这个方法的信息
在这里插入图片描述
如果想要加强被代理对象的方法,实现代理的共能,就可以用method.invoke(被代理对象,参数),这样可以得到一个返回值这个就是被代理对象原封不动的方法,想要增强可以从两方面入手:增强传入的参数,增强返回结果。

好了,感觉写的还是很模糊,不是很了解代理的原理是什么,只是归纳了一下使用的方法。总的来说就是根据Proxy.newProxyInstance创建了一个代理对象,传入被代理对象的一些参数,类加载器,接口,再实现一个InvocationHandler的实体类,重写了invoke的方法。创建出来的代理对象,转型为可以被代理对象的接口类型,调用这个代理对象,就会触发InvocationHandler的实体类中invoke的方法,就是这里的方法都会执行,并且会把代理对象调用的方法名称,传入的参数通过反射传回给InvocationHandler实体类的invoke方法,要是想通过代理加强被代理对象的方法,即可以通过method.invoke(被代理对象,参数)**这个方法(如果不做改变,相当于被代理对象调用这个方法)**如果要加强,则可以通过增强传入的参数,增强返回结果来加强被代理对象的方法。

额,好像我自己也不知道写了些啥,哈哈将就一下吧,写这玩意儿居然写了一早上,看来还是我归纳总结的水平不行啊,可能对这知识也没有认识到位,认知错误,不知道自己不知道,以为自己知道了,写下来之后才发现自己不知道,呵呵,这也听绕口的,看来这我也以为自己是知道了的,其实我还不怎么知道,算了,不写了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值