代理模式简介

2020-04-04  本文已影响0人  CCCrash

1、静态代理:(1)先定义一个接口,确定需要实现的方法;(2)创建代理类和具体的被代理类,这两个类都需要实现这个接口;(3)在代理类的构造方法中传递过来被代理类的实例,这样就可以获取到被代理类,在代理类实现的接口方法中可以调用被代理类的实现方法,同时还可以在代理类中加别的方法;这就是静态代理的基本流程。

2、动态代理:jdk动态代理,只能为接口创建代理,在运行时实现的,其中主要的是一个InVocationHandler:

demo测试一下:

(1)定义一个接口:

public interface Animal {

void eat();

}

(2)创建具体的对象:
public class Tigerimplements Animal{

private static final StringTAG ="Tiger";

    @Override

    public void eat() {

System.out.println("eat tiger");

    }

}

(3)具体的代理类实现上面说的一个接口:

public class Proxy implements InvocationHandler {

private static final StringTAG ="Proxy";

    private Objecttarget;

    public Proxy(Object target) {

this.target = target;

    }

/**

    * @param proxy  真是对象的代理

    * @param method 真是对象的方法

    * @param objects 代理真是对象的某个方法的参数

    * @return

    * @throws Throwable

*/

    @Override

    public Objectinvoke(Object proxy, Method method, Object[] objects)throws Throwable {

//此处打印一些东西

System.out.println("proxy: " + proxy.getClass().getName());

        System.out.println("before: ");

        method.invoke(target, objects);

        System.out.println("after: ");

return null;

    }

}

(4)main方法调用:

public static void main(String[] args) {

Animal tiger =new Tiger();

    Proxy proxy =new Proxy(tiger);

    //通过反射获得真是的代理对象

    Animal animal = (Animal) java.lang.reflect.Proxy.newProxyInstance(tiger.getClass().getClassLoader(),

            tiger.getClass().getInterfaces(), proxy);

    //通过代理对象调用真实的方法,这时候会调用Proxy类的invoke方法

    animal.eat();

    //获得真是对象的代理对象岁对应的class对象的名称

    System.out.println("main: " + animal.getClass().getName());

}

执行完成后的结果:

上一篇 下一篇

猜你喜欢

热点阅读