动态代理java
所谓动态,就是在运行期间生成代理类。否则,有100个须要被代理的类,你就得手动写100个代理类,代码膨胀得厉害。代理
而我如今的目标是弄清楚jdk如何实现动态代理。接口
阅读Proxy类的源码可以看清大致流程:源码
一、咱们本身提供接口和类加载器,而后jdk去经过Class.forName的方式去加载以及初始化这些接口,并生成类型信息。io
二、有了这些接口的类型信息,就能够经过反射获得全部的方法的信息编译
三、这个时候有2种选择:经过已有的信息生成代理类的java源代码文件,而后动态编译生成class文件。class
而jdk用的是另外一种,将已有信息直接写入class文件。由于class文件的内容分布是固定的,因此按照class文件的格式一个一个的写二进制流就能够实现。效率
相比第一种,第二种的效率更高。原理
四、有了class文件,就能够调用defineClass方法生成代理类的类型信息jdk
五、有了代理类的类型信息,就能够经过反射调用参构造方法,把咱们自定义的InvocationHandler传进去,生成代理类的实例。
经过动态代理的实现原理,能够清楚的看到:类加载机制相对灵活,只要你能获得符合规范的class文件,就能够生成对应的类型信息,而后经过反射就能够干不少事情。
可是动态代理的惟一遗憾是必需要实现接口,而另外还有一种方式---cglib,能够更加灵活的实现动态代理。关于cglib,且听下回分解。