动态代理
所谓动态,就是在运行期间生成代理类。不然,有100个需要被代理的类,你就得手动写100个代理类,代码膨胀得厉害。
而我现在的目标是弄清楚jdk如何实现动态代理。
阅读Proxy类的源码能够看清大体流程:
1、我们自己提供接口和类加载器,然后jdk去通过Class.forName的方式去加载以及初始化这些接口,并生成类型信息。
2、有了这些接口的类型信息,就可以通过反射得到所有的方法的信息
3、这个时候有2种选择:通过已有的信息生成代理类的java源代码文件,然后动态编译生成class文件。
而jdk用的是另一种,将已有信息直接写入class文件。因为class文件的内容分布是固定的,所以按照class文件的格式一个一个的写二进制流就可以实现。
相比第一种,第二种的效率更高。
4、有了class文件,就可以调用defineClass方法生成代理类的类型信息
5、有了代理类的类型信息,就可以通过反射调用无参构造方法,生成代理类的实例。
通过动态代理的实现原理,可以清楚的看到:类加载机制相对灵活,只要你能得到符合规范的class文件,就可以生成对应的类型信息,然后通过反射就可以干很多事情。
但是动态代理的唯一遗憾是必须要实现接口,而另外还有一种方式---cglib,可以更加灵活的实现动态代理。关于cglib,且听下回分解。
时间: 2024-10-12 00:20:25