首页 > 其他 > 详细

JDK动态代理小例子

时间:2017-02-27 19:03:01      阅读:137      评论:0      收藏:0      [点我收藏+]

一个小汽车,有一个跑run()的方法,我们想使用jdk动态代理使小汽车执行run之前 加点油,run之后洗车。

有四个类,接口Car(小汽车)Kayan(具体实现类(卡宴)) CarProxy(汽车的代理) Test(测试类)

Car

public interface Car {

    public void run();
 }

Kayan这个是小汽车实现类

public class Kayan implements Car {

    @Override
    public void run() {

        System.out.println("小汽车开始跑。。。。。。。。");
    }

}


CarProxy  小汽车的代理类

public class CarProxy implements InvocationHandler {

    // 小汽车会被代理
    private Car car;

    // 通过set传入小汽车
    public Car getCar() {

        return car;
    }

    public void setCar(Car car) {

        this.car = car;
    }

    public Car creatCarProxy() {

        Car proxy = (Car) Proxy.newProxyInstance(car.getClass().getClassLoader(), car.getClass().getInterfaces(), this);
        return proxy;

    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        if ("run".equals(method.getName())) {
            // 小汽车想要跑之前那要先加油啊
            System.out.println("给小汽车加油啊。。oil。。oil。。oil");
            Object object = method.invoke(car, args);
            System.out.println("跑完之后给小汽车擦车啊。。clean。。clean");
            return object;

        }

        return method.invoke(car, args);
    }

}


测试代码

// 测试小汽车的代理
    @Test
    public void testCarProxy() {

        Car ky = new Kayan();
        CarProxy proxy = new CarProxy();
        proxy.setCar(ky);
        Car carProxy = proxy.creatCarProxy();
        carProxy.run();

    }


最后的结果显示

技术分享

 这种实现的思想类似于Spring的Aop的实现思路,但是AOP在使用jdk动态代理的时候也是用CGLib代理 。

JDK动态代理小例子

原文:http://www.cnblogs.com/zhanghaoliang/p/6475636.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!