黑马程序员技术交流社区

标题: 动态代理类 [打印本页]

作者: 明天,你好    时间: 2013-5-15 02:22
标题: 动态代理类
本帖最后由 明天,你好 于 2013-5-22 22:16 编辑
  1. public Connection getConnection() throws SQLException {
  2. if(list.size() == 0){
  3. for (int i = 0; i < 5; i++) {
  4. Connection conn = DriverManager.getConnection(
  5. "jdbc:mysql:///mydb", "root", "root");
  6. list.add(conn);
  7. }
  8. }

  9. final Connection conn = list.remove(0);
  10. return (Connection)Proxy.newProxyInstance(conn.getClass().getClassLoader(), conn.getClass().getInterfaces(), new InvocationHandler(){
  11. public Object invoke(Object proxy, Method method, Object[] args)
  12. throws Throwable {
  13. if("close".equals(method.getName())){
  14. 。。。。。。
  15. return null;
  16. }
  17. return method.invoke(conn, args);
  18. }
  19. });
  20. }
复制代码
看MySQL时用动态代理类改写connection 的close() 方法。动态代理能看明白就是其中invoke(xx,xx,xx)中的proxy 是什么东东忘了,视频删了 不想再下载,请了解动态代理类的同学,仔细给解释一下 动态代理类的运行过程。

作者: SOAR    时间: 2013-5-15 07:29
invoke(Object proxy,Method m,Object args[]){}
proxy就是代理实例,或者说就是你实现了InvocationHandler那个接口的实例。
作者: 赵崇友    时间: 2013-5-15 10:17
楼主竟然把zxx的视频删掉了。。。。那么好的视频,咋删了呀。
首先,proxy你查查api文档,这个主要是用来动态生成代理类的。
invoke是在为委托类设计代理的时候,需要给Proxy.getProxyClass传递一个InvocaHandler的对象参数,而实现InvocationHandler的接口覆盖其中的方法。
运行过程是:当你使用代理类为委托类实现某一个功能时(就是使用代理来执行委托类中的方法),这个时候就会用到了你实现了InvocationHandler接口的那个对象,此实例对象就会将代理实例对象和方法以及参数传递给invoke函数,就是对应invoke的三个形式参数了。这个时候程序就会执行invoke中的代码,注意这时候传递的方法是委托类中的方法,而且可以在调用委托类中的方法之前和之后以及catch中增加Advice(你要为委托类实现什么功能的代码),另外还可以过滤方法,当为某一个方法时,不执行委托类的方法。最后将invoke执行的结果用return语句返回(注意这里返回的是Object的类,因为每个具体方法的返回值类型都不一样)。这个结果就是你使用代理调用委托类中的方法的结果了。这就是代理的基本过程!!
不知道说明白了没有,我这有zxx的高新技术的PPT,如果有需要,可以向我索取。

作者: Sword    时间: 2013-5-21 09:48
如果问题未解决,请继续追问,如果问题解决了,请点击你的帖子下面的"编辑"重新编辑帖子,将分类改为“已解决”,谢谢合作!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2