1. 程式人生 > >關於動態代理

關於動態代理

static ride odi tint 對象 win @override 分別是 ide

---恢復內容開始---

  動態代理是相對於靜態代理來說的,相比於後者,前者能夠增強代碼的復用性,可以處理一類對象。

  動態代理兩種分別是JDK動態代理和Cglib動態動態代理:

  前者要求代理類對象和委托類實現相同的接口,否則不能生成代理對象,而且指定方法較為麻煩。代碼如下:

  public class Proxy{

    //獲取代理對象的靜態方法

    public static Object getProxy(final Object target , final TranactionManager tx){

    //利用target參數獲取類加載器,真實對象類上的接口和指定接口,創建代理對象     

    Object proxy = Proxy.NewInstance(target.getClass().getClassLoader , target.getClass().getInterfaces() , new InvocationHandler( ){

         //當與方法關聯的代理實例上調用方法時,將在調用處理程序上調用此方法

[email protected]

          public Object invoke(Object proxy,Method method , Object[] args) throws throwable{

        tx.begin();

        method.invoke(target,args);

        tx.commit();

        } 

      });

return proxy;   

    }

  }

  後者不管有無接口都可以實現代理對象,生成的代理對象時目標對象的子類

public class DynamicProxy {

//獲取代理對象
public static Object getProxy(final Object target,final TranactionManager tx){

//增強器 底層操作的是二進制碼
Enhancer enhancer = new Enhancer();

//設置接口
enhancer.setInterfaces(target.getClass().getInterfaces());

//設置父類
enhancer.setSuperclass(target.getClass());

//創建代理對象
return enhancer.create();

//設置回調 代理對象調用方法時,此方法進行攔截,進入到此方法中

//當與方法關聯的代理實例上調用方法時,將在調用處理程序上調用此方法
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {

tx.begin();
//調用真實對象的方法
Object result = method.invoke(target, args);
tx.commit();

return result;
}
});



}
}

  

---恢復內容結束---

關於動態代理