温故知新--重温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系统,在汽车被盗以后,可以通过远程遥控获取汽车的位置然后死锁汽车,让其小偷不能把车顺利转移!

 

 

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