代理模式的概念:
动态代理:在程序执行过程中,用jdk的反射机制创建代理类对象,并动态指定要代理的目标类
可以在不改变原来目标方法功能的前提下,在代理中增强自己的功能代码 jdk动态代理,必须有接口,目标类必须实现接口,没有接口时用cglib
有A B C三个类,A不能直接访问C,A通过B访问C,B就是代理类
代理模式的作用:
1.功能增强:在你原有的功能上,增加了额外的功能,新增加的功能就叫功能增强
2.控制访问:代理类不让你访问目标 实现代理的方式:
1.静态代理:代理类是手工实现的,自己创建一个java类,表示代理类,同时你要代理的目标类是固定的 优点:实现简单,容易实现 缺点:目标类增加,代理类也要成倍增加,功能增加或修改,其他类也要跟着增加修改
2.jdk动态代理:用java反射包中的类和接口实现动态代理功能
反射包:java.lang.reflect 类:InvocationHandler,Method,Proxy
InvocationHandler接口:方法invoke():表示代理对象要执行的功能代码
Method类:表示方法,类中的方法。通过Method可以执行某个方法
创建代理类对象
Test01 t1 = new Impl();
通过Method执行say方法调用
Method m1 = Test01.class.getMethod("say", String.class);
invoke是Method类中的一个方法,表示执行方法的调用
参数:Object 表示对象,要执行这个对象的方法 args:方法执行时的参数值
m1.invoke(t1,"李四");
Proxy类:核心的对象,创建代理对象。之前创建对象都是new类,现在用proxy类代替new类
方法:静态方法 newProxyInstance()
作用:创建代理对象,等同于Taobao taobao = new Taobao();
参数:
1.ClassLoader类加载器,负责向内存中加载对象,用反射获取对象的ClassLoader,类a a.getClass().getClassLoader()
2.Class<?>[] interfaces接口,目标对象实现的接口,也是反射获取的
3.InvocationHandler h,自定义的代理类要完成的功能
实现动态代理的步骤:
1.创建接口,定义目标类要完成的功能
2.创建目标类实现接口
3.创建invocationHandler接口的实现类,在invoke方法中完成代理类的功能
调用目标方法
增强功能
4.用Proxy类的静态方法,创建代理对象,并把返回值转为接口类型
创建目标对象
Sell f1 = new Factory1();
创建InvocationHandler对象
InvocationHandler handler = new SellHandler(f1);
创建动态代理对象 强制转为接口类型
Sell proxy = (Sell) Proxy.newProxyInstance(f1.getClass().getClassLoader(),f1.getClass().getInterfaces(),handler);
通过动态代理对象执行方法
Integer price = proxy.sell(1);
CGLib动态代理:cglib是第三方工具库,创建代理对象,要求目标类必须能被继承,不能是final的类,方法也不能为static
工具类 Enhancer en = new Enhancer():完成子类代理对象的创建
en.setSuperclass(target,getClass());设置父类
en.setCallback(this);设置回调函数
return en.create();返回子类代理对象