溫故知新--重溫java Proxy

之前在使用spring的時候就瞭解過java中的代理機制,但是當時也是理解的一知半解的.今天看了組長一篇有關無等待數據庫連接池的文章,裏面使用到Proxy繞過Connection 的正常關閉,而把Connection 放入到隊列中重複使用從而提高數據庫連接數度,提高機器效率!(http://www.javagg.com/diary/88574472)

重溫Proxy的作用後,感覺對以前模糊的理解有所幫助!

 

特寫下一段示例代碼:

interface HandleTask {
	public void open();

	public void close();
}

class WorkTask implements HandleTask {

	@Override
	public void close() {
		// TODO Auto-generated method stub

	}

	@Override
	public void open() {
		System.out.println("開門");
	}

}

 代理操作和不使用代理的區別:

public class TestProxy implements InvocationHandler {//實現InvocationHandle中invoke方法

	private HandleTask task;

	public TestProxy(HandleTask task) {
		this.task = task;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object obj = null;
		if (method.getName().equals("open"))//針對代理對象各方法的操作
			System.out.println("開門了!");
		obj = method.invoke(task, args);
		return null;
	}

	public HandleTask getHandleTask() {
		return (HandleTask) Proxy.newProxyInstance(task.getClass().getClassLoader(), new Class[] { HandleTask.class }, this);
	}

	public static void main(String[] args) {
		HandleTask ht = new WorkTask();
		ht.open();
		System.out.println("/////////代理前");
		TestProxy tp = new TestProxy(ht);//把ht實例關聯上代理操作
		ht = tp.getHandleTask();
//經過代理關聯ht實例和之前似乎沒有什麼不一樣,但是....		
                ht.open();
}
}

 運行結果:

開門
/////////代理前
開門了!
開門
 

看到了,ht實例在代理前後相同方法的調用,出現了不同的情況.這就是代理的傑作!

個人理解:

代理就如同對實例的監視器,當要對實例操作的時候,可以通過代理規則對其操作進行一些邏輯和干預.

就如同現在一些汽車上的GPS系統,在汽車被盜以後,可以通過遠程遙控獲取汽車的位置然後死鎖汽車,讓其小偷不能把車順利轉移!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章