1.request中的方法的增强的三种方式
继承: 能够控制这个类的构造.
装饰者: 增强的类和被增强的类实现相同的接口,增强的类中获得到被增强的类的引用.
接口中方法过多,只增强其中的某个方法.其他的方法也需要重写.
动态代理: 被增强的类实现了接口.
JDK中动态代理: Proxy对象.
Proxy.newProxyInstance(ClassLoader cl,Class[] interfaces,InvocationHandler ih);
//类加载器,被增强的类实现的接口,第三个参数是真正处理事情的,也是核心
示例:
[1] 现在一个接口中创建一个waiter类
public interface Waiter {
public void server();
public String sayHello(String name);
}
[2]
class MyInvocationHandler implements InvocationHandler{
private Waiter waiter;
public MyInvocationHandler(Waiter waiter){ //对waiter方法进行增强
this.waiter = waiter;
}
[3] 用动态代理执行方法
@Test
public void demo1(){
Waiter waiter = new Waitress();
// waiter.server();
// 使用动态代理:Proxy.newProxyInstance();
/**
* ClassLoader :类加载器.
* Class[] :被增强的对象实现的所有接口
* InvocationHandler :处理类。他也是一个接口
*/
// 得到第一个参数类加载器:
ClassLoader classLoader = waiter.getClass().getClassLoader(); //等号右边的就是第一个参数的固定格式
// 第二个参数:
Class[] interfaces = waiter.getClass().getInterfaces();//得到这个类的所有接口,等号右边的就是第二个参数的固定格式
// 第三次参数:
//通过下面创建的类。产生一个代理,产生一个对waiter的代理
Waiter waiter2 = (Waiter)Proxy.newProxyInstance(classLoader, interfaces, new MyInvocationHandler(waiter));
waiter2.server();
// 说明现在调用代理对象的任何方法的时候,InvocationHandler中的invoke都会执行.
String s = waiter2.sayHello("张凤");
System.out.println(s);
}
}