java提供類與cglib包實現動態代理

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