动态代理及request增强的三种方式

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);
}

}

猜你喜欢

转载自blog.csdn.net/pf503603/article/details/82418680