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

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值