2. 动态代理作用
最终是学习AOP(面向切面编程),它与装饰者模式有点相似,它比装饰者模式还要灵活!
InvocationHandler
public Object invoke(Object proxy, Method method, Object[] args);
?
这个invoke()方法在什么时候被调用!
1. 在代理对象被创建时?错误的!
2. 在调用代理对象所实现接口中的方法时?正确的!
?
* Object proxy:当前对象,即被代理的对象!在调用谁的方法!
* Method method:当前被调用的方法(目标对象的方法)
* Object[] args:实参!
目标对象:被增强的对象
代理对象:需要目标对象,然后在目标对象上添加了增强后的对象!
目标方法:增强的内容
代理对象 = 目标对象 + 增强
?
实例:
文件说明: 1. 一个 Waiter 接口,里面有 server () 方法
???? 2. 实现 了 Waiter 接口 的 ManWaiter 类
???? 3. Test.java 类
1. Waiter.java 接口
// 服务员 public ????// 服务 ????public } |
?
2.ManWaiter.java 类, 实现了 Waiter 接口
? //该类实现了 Waiter 接口 public ????public ????????System.out.println("服务中..."); ????} } |
?
3. Test.java 测试类
/** * 我们必须要掌握的是当前这个案例! */ public ????@Test ????public ????????Waiter manWaiter = new ManWaiter();//目标对象 ????????/* ???????? * 给出三个参数,来创建方法,得到代理对象 ???????? */ ????????ClassLoader loader = this.getClass().getClassLoader(); ????????Class[] interfaces = {Waiter.class}; ????????InvocationHandler h = new WaiterInvocationHandler(manWaiter);//参数manWaiter表示目标对象 ????????// 得到代理对象,代理对象就是在目标对象的基础上进行了增强的对象! ????????Waiter waiterProxy = (Waiter)Proxy.newProxyInstance(loader, interfaces, h); ???????? ????????waiterProxy.serve();//前面添加"您好", 后面添加"再见" ????} } ? //WaiterInvocationHandler 实现了 InvocationHandler 接口,并重写了 class WaiterInvocationHandler implements InvocationHandler { ????private Waiter waiter;//目标对象 ???? ????//提供 ????public WaiterInvocationHandler(Waiter waiter) { ????????this.waiter = waiter; ????} ???? ????public Object invoke(Object proxy, Method method, Object[] args) ????????????throws Throwable { ????????System.out.println("您好!"); ????????this.waiter.serve();//调用目标对象的目标方法 ????????System.out.println("再见!"); ????????return ????} } |
?
运行结果: