1.代理模式:
答:当一个对象不能直接使用,可以在客户端和目标对象之间创建一个中介,这个中介就是代理
作用:控制访问: 在代理中,控制是否可以调用目标对象的方法
功能增强: 功能增强,可以在完成目标对象的调用时,附加一些额外的功能,这些额外的功能叫做功能增强。
静态代理:代理类是手工实现的java文件,同时代理的目标对象是固定的。
优点:容易理解,使用方便
缺点:在目标类比较多的时候,会产生大量的代理类;当接口改变时,影响的目标类和代理比较多,都需要修改
2.什么是动态代理?
答:使用JDK的反射机制,创建对象的能力,创建的是代理类的对象。而不用你创建类文件,也就是.java文件。代理的目标类是活动的,可设置的。
动态:在程序执行时,调用JDK提供的方法才能创建代理类的对象。
jdk动态代理,必须有接口,目标类必须实现接口,没有接口时,需要使用cglib动态代理
特点:1.不用创建代理类 2.可以给不同的目标随时创建代理
动态代理的实现:1.jdk动态代理(理解):使用java反射包中的类和接口实现动态代理的功能
反射包:java.lang.reflect ,里面有三个类:InvocationHandler,method,Proxy.
2.cglib动态代理(了解):cglib是第三方的工具库,创建代理对象。
cglib的原理是继承,cglib通过继承目标类,创建它的子类,在子类中重写父类中同名的方法,实现功能的修改。
因为cglib是继承,重写方法,所以要求目标类不能是final的,方法也不能是final的
3.jdk动态代理:
1.反射,Method类,表示方法。类中的方法。通过method可以执行某个方法。
2.jdk动态代理的实现
1)InvocationHandler 接口(调用处理器) 就一个 invoke():表示代理对象要执行的功能代码。你的代理类要完成的功能就写在invoke()方法中。
代理类完成的功能:1、调用目标方法,执行目标方法的功能
2、功能增强,在目标方法调用时,增加功能。
方法原型:
参数:Object proxy:jdk创建的代理对象,无需赋值。
Method method:目标类中的方法,jdk提供method对象的
Object[] args:目标类中方法的参数,jdk提供的。
public Object invoke(Object proxy, Method method, Object[] args)
怎么用:1、创建InvocationHandler 2、重写invoke()方法,把原来静态代理中代理类要完成的功能,写在这
2) Method类:表示方法的,确切的说就是目标类中的方法。
作用:通过Method可以执行某个目标类的方法,Method.invoke();
3)Proxy类:核心的对象,创建代理对象。之前创建对象都是new 类的构造方法()
现在我们是使用Proxy类的方法,代替new的使用。
方法:静态方法 newProxyInstance()
作用是:创建代理对象,等同于静态代理创建代理对象(TaoBao taoBao = new TaoBao();)
参数:
1. ClassLoader loader 类加载器,负责向内存中加载对象的。使用反射获取对象的ClassLoader
类a,a.getClass().getClassLoader() ,目标对象的类加载器
2.Class<?>[] interfaces:接口,目标对象实现的接口,也是反射获取的。
3. InvocationHandler h:我们自己写的,代理类要完成的功能。
返回值:就是代理对象
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
3.实现动态代理的步骤:
1.创建接口,定义目标类要完成的功能
2.创建目标类实现接口
3.创建InvocationHandler接口的实现类,在invoke方法中完成代理类的功能
1.调用目标方法
2.增强功能
4. 使用Proxy类的静态方法,创建代理对象。并把返回值转为接口类型
//com.sun.proxy.$Proxy0:这是jdk动态代理创建的对象类型。