动态代理:
特征:
字节码随用随创建,随用随加载
作用:
不修改源码的基础上,对已有方法进行加强
优势:
去除重复代码,对重复代码进行统一管理和调配
取出重复代码:
可以提高开发效率
降低代码间的依赖关系
降低代码的维护成本
分类:
基于接口的动态代理:
提供者:JDK官方
使用要求:被代理对象至少实现一个接口
创建代理对象的类:Proxy
创建代理对象的方法:newProxyInstance()
创建代理对象方法的三个参数(由于jdk检查非常严格,所有在代理被代理对象时,需要具备与被代理对象有一样的特征才能瞒过jdk的检查):
ClassLoader :类加载器
需要有和被代理对象一样的类加载器
例如:被代理对象为User 则加载器为User.class.getClassLoader()
注意:类加载器不是写谁都行!
java有三个加载器:java是通过层层加载的(父类加载委托机制:当加载时都要判断父类是否加载,如果父类已经加载,则子类不加载,反之,父类没有加载,则子类才进行加载
第一个:Bootstrap:
它是嵌套在java虚拟机中的二进制程序,负责加载jdk中的rt,.jar,tools.jar等
第二个:ExClassLoader
它只负责加载jdk中扩展目录的字节码
java目录下的jrelibext
第三个:AppClassLoader
它负责加载我们自己写的类的字节码,还包括我们导入的lib的字节码
Class[] : 字节码数组
让被代理对象和代理对象具有相同的行为(方法)
和被代理对象实现相同的接口即可。
如对象为普通类User 则 User.getClass().getInterfaces();
如果被代理的是一个接口:
如对象为UserDao 则: new Class[ ]{UserDao.class}
InvocationHadler:提供增强代码的接口。谁用谁来写一个该接口的实现类,通常写的是匿名内部类
基于子类的代理对象:
提供者:第三方cglib
使用要求:被代理类不能使最终类。不能被final修饰
创建代理对象的类:Enhancer
创建代理对象的方法:create();
创建代理对象方法的参数:
Class
Callback:它里面没有方法,我们用的是它的子接口MethodInterceptor