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

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值