终于有点空余时间,决定把以前学习的知识点整理一下,备之后复习。 java
动态代理有三角色:抽象角色,代理角色,真是角色。 学习
第一个记录下java提供的动态代理。即便用Proxy类和InvocationHandel接口。直接上贴上代码: this
class MyInvocationHandel implements InvocationHandler{ private Object obj; //这是原对象 //传入源对象,返回代理对象 public Object bind(Object obj){ this.obj=obj; return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("用户验证成功"); Object object=method.invoke(obj, args); System.out.println("日志记录:xxx在xx时刻调用了"+method.getName()); return object; } }经过invocationHandel接口能够代理对象的方法,咱们能够加入日志记录等等,代码很简单,功能很强大。
第二个记录下经过cglig包实现的动态代理,比java提供的动态代理优势在于能够提供抽象类方法的代理(不知这样说准确不)。要使用这种代理首先须要导入cglib.jar和asm.jar,而后使用Enhancer类与MethodInterceptor接口,代码: 代理
public class CGlibFactory implements MethodInterceptor{ private Object targerObj; //原对象 //经过原对象返回代理对象 public Object createInstance(Object targerObj){ this.targerObj = targerObj; Enhancer en = new Enhancer(); return en.create(this.targerObj.getClass(),this.targerObj.getClass().getInterfaces(),this); } public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { System.out.println("用户验证..."); Object result= methodProxy.invoke(targerObj, args); System.out.println("xx用户调用xx方法"); return result; } }