首页 > 其他 > 详细

现炒现买__jdk动态代理

时间:2020-04-11 14:28:18      阅读:45      评论:0      收藏:0      [点我收藏+]

参看文章

彻底理解JAVA动态代理

https://www.cnblogs.com/flyoung2008/p/3251148.html

(个人觉得这篇文章美中不足的就是:没有源码应用案例。

下面是我在mybatis源码中挑选出的一段代码,通过分析框架中jdk动态代理的使用方式,来理解动态代理。

就像我们的题海战略,通过大量的习题,来理解抽象的概念【对动态代理原理的理解】。

希望反复看,结合看,慢慢看,达到掌握动态代理的目的。)

看完参考文章,怎么理解下面动态代理代码

技术分享图片

 代码来自org.apache.ibatis.logging.jdbc.ConnectionLogger

技术分享图片

 

怎么理解这个newInstance代码?

 解释上面的代码

InvocationHandler handler = new ConnectionLogger(conn, statementLog, queryStack);

创建一个InvocationHandler类型的对象
ClassLoader cl = Connection.class.getClassLoader();

获取类加载器
return (Connection) Proxy.newProxyInstance(cl, new Class[]{Connection.class}, handler);

根据类加载器、接口,返回需要代理的类的classtype(这里是Connection类型);

根据反射创建Connection对象,传入handler,用构造方法反射方式创建;

 

使用Connection代理类,使用原理是什么?

参考下图doSomething方法。

假设connection接口中有一个doSomething方法,下面是返回的代理类的伪代码。

public final void doSomething()
{
  try {
    super.handler.invoke(this, m3, null);
    // 可以这样理解 method.invoke(this,args)
    // 也就是 XXXconnection.doSomething(args)
    return;
  } catch(Error _ex) { }
  catch(Throwable throwable) {
    throw new UndeclaredThrowableException(throwable);
  }
}

参考文章中,有利于理解动态代理的代码片段

Poxy.newProxyInstance代码关键部分

技术分享图片

 代理对象二进制编码反编译的结果

技术分享图片

 

 

 技术分享图片

 

现炒现买__jdk动态代理

原文:https://www.cnblogs.com/windy13/p/12679305.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!