JDK动态代理小例子

一个小汽车,有一个跑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代理 。

posted @ 2017-02-27 17:59  张昊亮  阅读(917)  评论(0编辑  收藏  举报