类加载与动态代理

动态代理java

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

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

阅读Proxy类的源码可以看清大致流程:源码

一、咱们本身提供接口和类加载器,而后jdk去经过Class.forName的方式去加载以及初始化这些接口,并生成类型信息。io

二、有了这些接口的类型信息,就能够经过反射获得全部的方法的信息编译

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

而jdk用的是另外一种,将已有信息直接写入class文件。由于class文件的内容分布是固定的,因此按照class文件的格式一个一个的写二进制流就能够实现。效率

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

四、有了class文件,就能够调用defineClass方法生成代理类的类型信息jdk

五、有了代理类的类型信息,就能够经过反射调用参构造方法,把咱们自定义的InvocationHandler传进去,生成代理类的实例。

 

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

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

相关文章
相关标签/搜索