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. PPT里面实现动态图表

    今天又被学生提问,可不可以在PPT中做类似Excel中的动态图表?Excel里实现动态图表的方法通常是将图表关联到一个固定的数据区域,然后通过其他单元格的值或者控件来改变该固定区域的数据,以达到动态改 ...

  2. Asp.NetCore之组件写法

    本章内容和大家分享的是Asp.NetCore组件写法,在netcore中很多东西都以提供组件的方式来使用,比如MVC架构,Session,Cache,数据库引用等: 这里我也通过调用验证码接口来自定义 ...

  3. DOM Mutation Observer

    源链接:http://www.jianshu.com/p/b5c9e4c7b1e1

  4. FPGA中将十进制数在数码管中显示(verilog版)--二进制转换为BCD码

    这周有朋友问怎样在fpga中用数码管来显示一个十进制数,比如1000.每个数码管上显示一位十进制数.如果用高级语言来分离各位,只需要分别对该数做1000,100,10对应的取商和取余即可分离出千百十个 ...

  5. Git命令行和Xcode结合使用

    现在一直使用Git来管理代码,对于有强迫症的我来说,依旧选择了命令行,下面这段话可以更好的解释我为什么喜欢使用终端敲命令. There are a lot of different ways to u ...

  6. lca最近公共祖先(模板)

    洛谷上的lca模板题--传送门 学了求lca的tarjan算法(离线),在洛谷上做模板题,结果后三个点超时. 又把询问改成链式前向星,才ok. 这个博客,tarjan分析的很详细. 附代码-- #in ...

  7. SQL Server 中截取字符串常用的函数

    SQL Server 中截取字符串常用的函数: 1.LEFT ( character_expression , integer_expression ) 函数说明:LEFT ( '源字符串' , '要 ...

  8. OutOfMemoryError内存不足

    java.lang.OutOfMemoryError内存不足错误.当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误. 造成此错误的原因有一下几个: 1.内存中加载的数据量过于庞大,如一次从数 ...

  9. unity 看到Sphere内部,通过Sphere播放全景视频时候遇到的问题

    Unity创建一Sphere默认是看不到球体内部的,所以需要用 Cull Front  修改剔除的方向,这就会带来一个新的问题,所播放的视频是像镜子一样翻转着的,所以要改变它的UV坐标使其翻转过来 f ...

  10. 设备像素,设备独立像素,CSS像素

    之前学了移动端的开发对设备像素.设备独立像素.CSS像素弄得不太清楚,所以趁周末的时间查了一下,稍加整理 一些概念 在进行具体的分析之前,首先得知道下面这些关键性基本概念. CSS像素 CSS像素是W ...