http://www.cnblogs.com/MOBIN/p/5597215.html   请先查看这边博文

此文主要是在上篇博文的基础之上,宏观的理一下思路,因为之前本人看了上篇之后云里雾里(是本人技术不到位)。然后研究了一会儿jdk1.8的源码之后写了此篇,不是很准确,源码上篇博文之中已经很多了,我就不加了。

1、 获取代理对象,需要传入类加载器,需要被实现的接口, InvocationHandler对象(该对象中,包含了我们自己编写的接口实现类实例,也就是未被代理的业务逻辑。比如有UserServieImpl实例,也就是target)。
调用的是 Proxy类中的newProxyInstance(classloader,interfaces,invocationHandler)方法来获取代理类的实例。
 
2、继续看 newProxyInstance 方法中,调用 getProxyClass0(loader,interfaces)来获取代理类的class对象(内部是类加载器加载了生成的字节码产生了该代理类的class对象),然后通过该class对象来获取getConstructor(constructorParams)构造方法,然后传入InvocationHandler对象来实例化代理对象并返回。
 
3、 getProxyClass0方法中主要实现的逻辑是,获取接口中的方法method(反射),将接口的包名全路径,方法名记录下来,在代理类中实现(通过字节码的方式,可以研究源码),通过static静态代码块的方式,将method通过反射的方式注入到代理类中m1,m2,m3等,同时还实现了equals,hashcode等方法,最后通过传入的InvocationHandler对象,来调用this.h.invoke(this, method, null); 方法 this就是代理类对象,method是通过静态注入获取到的method对象,是接口所定义的。
在我们实现的InvocationHandler对象中实现了如下方法
 
   @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println(“—– before —–“);
Object result = method.invoke(target, args);
System.out.println(“—– after —–“);
return result;
}
其中:proxy是代理类实例,method是接口中的方法对象,也是在代理类中实现的当前方法,是代理类实现接口方法的时候作为参数传递过来的,args是参数,方法没有入参则为null
method.invoke(target,args)是java反射中的方法.target是接口实现类的实例(也就是比如的UserServiceImpl),method是接口定义的方法。

jdk动态代理原理的更多相关文章

  1. 代理模式(静态代理、JDK动态代理原理分析、CGLIB动态代理)

    代理模式 代理模式是设计模式之一,为一个对象提供一个替身或者占位符以控制对这个对象的访问,它给目标对象提供一个代理对象,由代理对象控制对目标对象的访问. 那么为什么要使用代理模式呢? 1.隔离,客户端 ...

  2. Java设计模式之JDK动态代理原理

    动态代理核心源码实现public Object getProxy() { //jdk 动态代理的使用方式 return Proxy.newProxyInstance( this.getClass(). ...

  3. 代理模式及jdk动态代理原理

    代理模式 :为其它对象提供代理,以控制对这个对象的访问. 代理模式的特征:代理类(proxyClass)与委托类(realClass)有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转 ...

  4. jdk动态代理使用及原理

    jdk动态代理的使用 1.创建实现InvocationHandler接口的类,实现invoke(Object proxy, Method method, Object[] args)接口,其中invo ...

  5. JDK动态代理与CGLib动态代理相关问题

    导读: 1.JDK动态代理原理是什么?为什么不支持类的代理? 2.JDK动态代理实例 3.CGLib代理原理是什么? 4.CGLib代理实例 5.JDK动态代理与CGLib代理的区别是什么? 6.总结 ...

  6. JDK动态代理为什么必须要基于接口?

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 前几天的时候,交流群里的小伙伴抛出了一个问题,为什么JDK的动态代理一定要基于接口实现呢? 好的安排,其实要想弄懂这个问题还是需要一些关于代理和 ...

  7. JDK动态代理的实现原理

    学习JDK动态代理,从源码层次来理解其实现原理参考:http://blog.csdn.net/jiankunking/article/details/52143504

  8. Java之美[从菜鸟到高手演练]之JDK动态代理的实现及原理

    Java之美[从菜鸟到高手演练]之JDK动态代理的实现及原理 JDK动态代理的实现及原理 作者:二青 邮箱:xtfggef@gmail.com     微博:http://weibo.com/xtfg ...

  9. JDK 动态代理实现原理

    一.引言 Java动态代理机制的出现,使得Java开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象便能动态生成代理类.代理类会负责将所有方法的调用分派到委托对象上反射执行,在分派执行的过 ...

随机推荐

  1. 原生JS实现弹出窗口的拖拽

    上一篇说了一下弹出窗口功能的实现思路,一般情况下紧接着就会需要做到弹窗的移动,当然现在有很插件.库比如hammer可以使用,效率也非常好.但我觉得还是有必要了解一下原生JS的实现思路及方式,如下: 思 ...

  2. github上预览Demo网页最简单的方法

    github上预览Demo网页最简单的方法: 1.打开你github上demo网页index.html,效果如图 2.复制上面的页面地址,然后在该地址前加上 htmlpreview.github.co ...

  3. 老李分享:接口测试之jmeter

    老李分享:接口测试之jmeter   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.移动端自动化测试很多人把他仅仅理解成appu ...

  4. 使用$.post和action或servlet交互 URL出现 http://localhost:8080/../[object%20Object] 错误的问题解决

    使用$.post时,如下所示: $.post({ url : "./test/ajaxTest", }); 控制台报:There is no Action mapped for n ...

  5. saltstack部署

    环境准备 [root@server elasticsearch]# cat /etc/redhat-release CentOS release 6.6 (Final)[root@server ela ...

  6. 第八章 Hibernate数据操作技巧

    第八章   Hibernate数据操作技巧8.1 分组统计数据    语法:[select]... from ...[where] [group by...[having...]] [order by ...

  7. 网站启用gzip压缩

    gzip压缩启用不启用还是要看实际情况的,启用gzip后可以相应的减轻带宽压力但是同时也会增加cpu的压力(压缩解压),相反的如果不启用那么cpu压力也会相应的减少,具体情况具体分析. Linux开启 ...

  8. 简单的RTSP消息交互过程

    C表示RTSP客户端,S表示RTSP服务端 第一步:查询服务器端可用方法 1. C->S:OPTION request       //询问S有哪些方法可用 2. S->C:OPTION ...

  9. Instrument详解

    Instruments用户指南介绍Instruments是应用程序用来动态跟踪和分析Mac OS X和iOS代码的实用工具.这是一个灵活而强大的工具,它让你可以跟踪一个或多个进程,并检查收集的数据.这 ...

  10. 深度学习入门实战(二)-用TensorFlow训练线性回归

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者 :董超 上一篇文章我们介绍了 MxNet 的安装,但 MxNet 有个缺点,那就是文档不太全,用起来可能 ...