这期我们来讲讲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