连咸鱼都能学会的Java动态代理

来源:互联网 发布:查日本经济数据的网站 编辑:程序博客网 时间:2024/04/30 04:01

这期我们来讲讲Java的动态代理


首先我们说下代理是怎么一回事,代理简单来说,就是在你肚子饿了,想找吃的时候, 登陆外卖平台,点上一大堆好吃的,然后等着外卖小哥送来。

代理在这个例子里的角色就是外卖平台,他不卖东西, 但是可以让真正卖东西的商家发货,起到代理的作用,能隐藏真正的店家,类似于代购。


现在我们来看看Java 动态代理的2种实现方法:

jdk动态代理和cglib动态代理


1.jdk动态代理:

首先我们来定义itemService 的接口



接下来,我们写一个类来实现这个itemService接口


接下来就是干正事了, 用jdk代理实现,写在个我们自己的拦截类去实现InvocationHandler 接口


好啦, 我们最后写个测试类,试下能不能成功运行这个代理


结果如下:


根据结果,我们可以发现, 在测试类通过代理调用getItemName(123456), getItemSize(123456) 方法的时候,会先跑MyInvocationHandler 类,然后在逻辑里我们对getItemName(xxx) 方法做了些处理,在结果里也能很好表现出来。


注意:用jdk实现代理的类都必须是实现了某些接口的类, 没有实现接口的类是用不了jdk动态代理的。

但是没关系,接下来我们实现类不用实现接口也能实现动态代理:cglib动态代理, 而且他还比用jdk动态代理快。


下面,我们要用cglib来实现动态代理:

同样,我们用回上面已经写好的ItemService接口和 ItemServiceImpl 接口,

与jdk动态代理不同,cglib实现拦截类的接口是MethodInterceptor ,

现在我们开始写自己的实现拦截类:


然后, 我们也写个测试类,看看结果是怎么样的:


结果如下:


这期关于Java 动态反射就简述到这, 相信大家也有了个大概的了解,欢迎大家去进一步研究


参考文档:

http://blog.csdn.net/heyutao007/article/details/49738887

http://blog.csdn.net/lovelion/article/details/8116704

原创粉丝点击