类加载与动态代理

动态代理

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

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

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

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

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

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

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

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

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

5、有了代理类的类型信息,就可以通过反射调用参构造方法,把我们自定义的InvocationHandler传进去,生成代理类的实例。

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

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

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