- 1、本文档共4页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
使用JDK动态代理完成自定义连接池
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
您可能关注的文档
- 企业财务管理试题.doc
- 企业防汛防洪防台风安全应急预案.doc
- 伊丽莎白与达西的傲慢与偏见形成原因差异的研究.doc
- 仿真基础学习.doc
- 伊平丽--数形结合思想在高中数学解题中的应用.doc
- 休斯顿Brays河口休闲区开发.docx
- 休闲豆制品的加工生产技术.doc
- 企业负责人人总复习四.docx
- 休克实验报告.docx
- 优化与扩展Mybatis的SqlMapper解析.doc
- 人教版高中化学必修第一册课时练习含答案合集共24套.doc
- 人教版高中化学必修第一册第4章物质结构元素周期律第1节第2课时元素周期表核素练习含答案.docx
- 人教版高中化学必修第一册课时课件合集共30套.ppt
- 人教版高中化学选择性必修3检测卷含答案合集共12套.doc
- 人教版高中化学必修第一册第4章物质结构元素周期律第1节第3课时原子结构与元素的性质课件.ppt
- 冀少版八年级生物上册第三章叶的光合作用导学案.doc
- 人教版高中化学必修第一册第1章物质及其变化第1节第1课时物质的分类课件.ppt
- 人教版高中化学选择性必修1第2章化学反应速率与化学平衡第1节第1课时化学反应速率及影响因素练习含答案.docx
- 人教版高中化学选择性必修1第4章化学反应与电能第3节金属的腐蚀与防护课件.ppt
- 人教版高中化学选择性必修3课时课件合集共27套.ppt
文档评论(0)