文档详情

使用JDK动态代理完成自定义连接池.doc

发布:2016-11-24约4.83千字共4页下载文档
文本预览下载声明
JDK动态代理 1 什么是JDK动态代理 刚刚写ItcastConnection时爽么?因为Connection中的方法太多了,每个都要写,所以很累吧。累点到是没什么,可以完成功能就是好的。但是不是什么时候可以用代理的,有时你可能会遇到要代理的东西,只有在运行时才能知道,所以你不可能先把代理写出来!这时就需要使用动态代理。 JDK动态代理是JavaSE中一个高级特性,不是那么好理解的,但是它可是框架们的“秘密武器”。你要是可以理解它,那么将来在学习框架时,你就会知道框架是怎么完成一些“神奇功能”的。 动态代理的作用:在运行时生成一个实现了指定接口的对象。   例如在运行时生成一个对象,这个对象实现了Connection接口。 2 JDK动态代理之Hello World 我们要写一个程序,这个程序会在运行时动态的生成一个对象,这个对象会实现Connection接口。 Connectoin c = (Connection)Proxy.newInstance(Connetion.class); 上面代码只是示意代码,不能编译通过的。 上面代码有个问题:生成一个实现了指定接口的对象,但是我们知道实现接口,需要为接口中每个方法添加实现内容,那么这个动态代理对象它是怎么实现Connection接口中的方法的呢?也就是说,我现在如果调用了代理对象的close()方法,它会执行什么呢?这就是问题! 想生成代理对象,还需要提供实现内容! 别的先别去管,先来看一个接口:InvocationHandler。 class HelloWorldHandler implements InvocationHandler { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(Hello 动态代理!); return null; } }   Connectoin c = (Connection)Proxy.newInstance(Connetion.class, new HelloWorldHandler());   上面代码还是示意代码,不能编译通过。 我们这回在创建代理对象时,多给出了一个参数,是一个接口的实现类。实现类中有一条输出语句“Hello 动态代理!”,现在生成的代理对象是Connection接口的实现类对象,你调用代理对象的任何方法都会调用HelloWorldHandler的invoke()方法,即输出“Hello 动态代理!”。 Connectoin c = (Connection)Proxy.newInstance(Connetion.class, new HelloWorldHandler()); c.close(); c.toString(); c.createStatement(); 还是示意代码! 上面示意代码中调用了三个方法,无论哪个方法都会输出“Hello 动态代理!”。现在你知道InvocationHandler接口的作用了吧。 public void fun2() throws SQLException { ClassLoader loader = Thread.currentThread().getContextClassLoader(); Class[] interfaces = {Connection.class}; InvocationHandler h = new HelloWorldHandler(); Connection con = (Connection)Proxy.newProxyInstance(loader, interfaces, h); con.close(); con.toString(); con.createStatement(); } 3 真正的代理 虽然我们学会了动态代理,但还没有真正的代理。真正的代理是需要一个真正的连接对象,然后我们的代理对象使用它来完成任务。为了说明这个真正的代理,需要写几个类: public interface Waiter { public void serve(); } public class WaiterImpl implements Waiter { public void serve() { System.out.println(服务...); } } public class WaiterProxy implements Waiter { private Waiter waiter; public W
显示全部
相似文档