您的位置:首页 > 编程语言 > Java开发

JDK动态代理小例子

2017-02-27 17:59 281 查看
一个小汽车,有一个跑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代理 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: