終於有點空餘時間,決定把以前學習的知識點整理一下,備之後複習。 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; } }