动态代理作用
最终是学习AOP(面向切面编程),它与装饰者模式有点相似,它比装饰者模式还要灵活!
InvocationHandler
public Object invoke(Object proxy, Method method, Object[] args);
这个invoke()方法在什么时候被调用!
- 在代理对象被创建时?错误的!
- 在调用代理对象所实现接口中的方法时?正确的!
- Object proxy:当前对象,即代理对象!在调用谁的方法!
- Method method:当前被调用的方法(目标方法)
- Object[] args:实参!
调用处理器-InvocationHandler图解
动态代理图解
目标对象:被增强的对象
代理对象:需要目标对象,然后在目标对象上添加了增强后的对象!
目标方法:增强的内容
代理对象 = 目标对象 + 增强
动态代理之Waiter案例
Waiter.java
package cn.itcast.demo2;
//服务员
public interface Waiter {
//只会服务
public void serve();
}
ManWaiter.java
package cn.itcast.demo2;
/**
* 男服务员
* @author WenHuagang
*
*/
public class ManWaiter implements Waiter {
public void serve() {
System.out.println("服务中...");
}
}
测试
package cn.itcast.demo2;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.junit.Test;
/**
* 动态代理之Waiter案例
* @author WenHuagang
*
*/
public class Demo1 {
@Test
public void fun1() {
/*
* 给出三大参数,调用Proxy.newProxyInstance(ClassLoader loader,Class[] interfaces, InvocationHandler h)
* 得到代理对象
*/
Waiter manWaiter = new ManWaiter();//manWaiter目标对象
ClassLoader loader = this.getClass().getClassLoader();
Class[] interfaces = {Waiter.class};
InvocationHandler h = new WaiterInvocationHandler(manWaiter);//传递目标对象
//得到代理对象,代理对象就是在目标对象到额基础上进行了增强后的对象!!!
Waiter waiterProxy = (Waiter)Proxy.newProxyInstance(loader, interfaces, h);
waiterProxy.serve();//前面添加"你好",后面添加"再见"
}
}
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("你好!");//增强的内容!
waiter.serve();//调用目标对象的方法
System.out.println("再见!");//增强的内容!
return null;
}
}