码迷,mamicode.com
首页 > 其他好文 > 详细

类加载与动态代理

时间:2016-12-13 10:11:39      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:灵活   name   接口   源码   代理   类加载   实现原理   膨胀   --   

动态代理

所谓动态,就是在运行期间生成代理类。不然,有100个需要被代理的类,你就得手动写100个代理类,代码膨胀得厉害。

而我现在的目标是弄清楚jdk如何实现动态代理。

阅读Proxy类的源码能够看清大体流程:

1、我们自己提供接口和类加载器,然后jdk去通过Class.forName的方式去加载以及初始化这些接口,并生成类型信息。

2、有了这些接口的类型信息,就可以通过反射得到所有的方法的信息

3、这个时候有2种选择:通过已有的信息生成代理类的java源代码文件,然后动态编译生成class文件。

而jdk用的是另一种,将已有信息直接写入class文件。因为class文件的内容分布是固定的,所以按照class文件的格式一个一个的写二进制流就可以实现。

相比第一种,第二种的效率更高。

4、有了class文件,就可以调用defineClass方法生成代理类的类型信息

5、有了代理类的类型信息,就可以通过反射调用无参构造方法,生成代理类的实例。

 

通过动态代理的实现原理,可以清楚的看到:类加载机制相对灵活,只要你能得到符合规范的class文件,就可以生成对应的类型信息,然后通过反射就可以干很多事情。

但是动态代理的唯一遗憾是必须要实现接口,而另外还有一种方式---cglib,可以更加灵活的实现动态代理。关于cglib,且听下回分解。

类加载与动态代理

标签:灵活   name   接口   源码   代理   类加载   实现原理   膨胀   --   

原文地址:http://www.cnblogs.com/cz123/p/6168571.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!