java 代理模式

来源:互联网 发布:java输入字符串语句 编辑:程序博客网 时间:2024/05/02 00:06

java代理模式主要有JDK代理模式实现方式和CJLIB代理模式,我们通过代码认识代理模式
*

一、(JDK代理模式)

*
这里写图片描述

1、新建一个接口类

public interface Moveable {    public void move();}

2、被代理类

public class Car implements Moveable {    @Override    public void move() {        try {            Thread.sleep(100);            System.out.println("车子开始移动!");        } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}

3、代理类

public class ProxyHandle implements InvocationHandler {    private Object target;    public ProxyHandle(Object target) {        super();        this.target=target;    }    /**     * proxy : 被代理对象     * method:被代理方法     * args  :被代理方法参数     *      * */    @Override    public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {        long start=System.currentTimeMillis();        method.invoke(target);        long end=System.currentTimeMillis();        System.out.println("移动时间:"+(end-start)+" 毫秒");        return null;    }}

4、JDK动态代理

public class Test {

public static void main(String[] args) {    Car car=new Car();    ProxyHandle ph=new ProxyHandle(car);    Class c=car.getClass();    /**     * 参数:     * loader:     * interfaces:所有继承的接口     * h:代理类     * */    //Proxy.newProxyInstance(loader, interfaces, h)    //产生一个被代理对象    Moveable moveable= (Moveable) Proxy.newProxyInstance(c.getClassLoader(), c.getInterfaces(), ph);    moveable.move();}

}

二(CJLIB)

1、被代理类

public class Train {    public void move() {        System.out.println("火车行驶中。。。。");    }}

2、代理类

public class CJLibProxy implements MethodInterceptor{    private Enhancer enhancer=new Enhancer();    public Object getProxy(Class clazz) {        //设置创建子类的类        enhancer.setSuperclass(clazz);        enhancer.setCallback(this);        return enhancer.create();    }    /**     * 拦截所有目标类方法的调用     *      * 参数:     * obj 目标累的实例     * method 目标方法的反射对象     * proxy 代理类的实例     *      * */    @Override    public Object intercept(Object obj, Method method, Object[] args,            MethodProxy proxy) throws Throwable {        System.out.println("------日志准备开始------");        proxy.invokeSuper(obj, args);        System.out.println("------日志已经结束------");        return null;    }}

3、CJLIB代理测试类

public class TestCJLib {    public static void main(String[] args) {        CJLibProxy proxy=new CJLibProxy();        Train train= (Train) proxy.getProxy(Train.class);        train.move();    }}
0 0