代理模式之:动态代理
ProxyPattern(即:代理模式),23种常用的面向对象软件的设计模式之一
代理模式: 静态代理(和装饰者很像), 动态代理
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
什么是动态代理
动态代理与代理模式原理是一样的,只是它没有具体的代理类,直接通过反射生成了一个代理对象
jvm通过反射的方式创建出来的代理对象,对目标方法进行增强
jdk中动态代理的使用
-
Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)生成一个代理对象
-
参数1:ClassLoader loader 代理对象的类加载器 一般使用被代理对象的类加载器
-
参数2:Class<?>[] interfaces 代理对象的要实现的接口 一般使用的被代理对象实现的接口
-
参数3:InvocationHandler h (接口)执行处理类
-
-
InvocationHandler中的invoke(Object proxy, Method method, Object[] args)方法:调用代理类的任何方法,此方法都会执行
-
参数1:代理对象
-
参数2:当前执行的方法
-
参数3:当前执行的方法运行时传递过来的参数
-
返回值:是当前代理对象所执行的方法的返回值
public interface Car { void run(); void stop(); String addOil(int num); }
汽车接口实现类
-
class Qq implements Car{ @Override public void run() { System.out.println("Qq可以跑60迈..."); } @Override public void stop() { System.out.println("Qq刹车...."); } @Override public String addOil(int num) { return "qq加"+num+"号油..."; } }
测试类
public class TestProxy { public static void main(String[] args) { Qq qq = new Qq(); Car proxyInstance = (Car) Proxy.newProxyInstance(qq.getClass().getClassLoader(), qq.getClass().getInterfaces(), (Object proxy, Method method, Object[] args1) -> { if ("run".equals(method.getName())) { System.out.println("Qq可以跑200迈"); return null; } System.out.println(method.invoke(qq, args1[0])); return "哈哈"; }); proxyInstance.run();// Qq可以跑200迈 // proxyInstance.stop(); //Qq刹车.... System.out.println(proxyInstance.addOil(95)); // qq加95号油... 哈哈 } }
-