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代理 。