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