java 代理模式

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

}
阅读更多
文章标签: java-代理模式
个人分类: java 设计模式
上一篇Oracle Mysql数据库分页
下一篇JAVA 解析XML之DOM方式
想对作者说点什么? 我来说一句

java代理模式

2018年02月06日 128KB 下载

Java设计模式之代理模式(结构)

2009年04月20日 112KB 下载

没有更多推荐了,返回首页

关闭
关闭
关闭