一、动态代理
1.代理模式
代理(Proxy)是一种设计模式, 提供了对目标对象另外的访问方式;即通过代理访问目标对象。 这样好处: 可以在目标对象实现的基础上,增强额外的功能操作。(方法增强),不修改目标对象,就可以完成功能的改造扩展
2.静态代理
由程序员创建代理类,并将目标对象装配到代理类中,自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了
3.动态代理
动态代理是在用JDK API,利用反射动态的在内存中创建代理对象,不需要实现接口,不会产生代理类过多的问题。
参考资料:Proxy.newProxyInstance源码探究_码猿手-CSDN博客_newproxyinstance源码
Proxy.newProxyInstance()的源码剖析:
①克隆拿到接口: final Class<?>[] intfs = interfaces.clone();
②得到代理类(核心):Class<?> cl = getProxyClass0(loader, intfs)
Proxy.ProxyClassFactory#apply()中的静态方法ProxyGenerator.generateProxyClass()通过产生指定的代理类信息,是二进制信息,可以使用IO流输出代理类的Java文件:
(1).收集代理类要实现的接口中的所有方法,包装成ProxyMethod对象,并通过Map保存接口名到ProxyMethod对象的映射;
(2).添加参数类型为InvocationHandler的代理类构造器方法;
(3).遍历Map,生成每个代理方法的Method类,作为静态字段添加到代理类中;
(4).遍历Map,完成每个代理方法的实现,添加到代理类中;
(5).添加静态初始化方法,将每个代理方法的引用赋值给对应的静态字段;
参考资料:JDK动态代理[4]----ProxyGenerator生成代理类的字节码文件解析_chuxiong5717的博客-CSDN博客
③创建新的代理对象:return cons.newInstance(new Object[]{h})
4.cglib帮助没有实现接口的类实现动态代理