之前在使用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系統,在汽車被盜以後,可以通過遠程遙控獲取汽車的位置然後死鎖汽車,讓其小偷不能把車順利轉移!