windy_yong
2016-02-17 15:02
logHandler调用invoke调用的是move方法,但为什么timeHandler也是调用move方法,这里已经隔了一层了。
public static void main(String[] args) {
Moveable car = new Car();
InvocationHandler timeHandler = new TimeHandler(car);
Class<?> cls = car.getClass();
/**
* loader:类加载器<br>
* interfaces:实现接口<br>
* h InvocationHandler<br>
*/
Moveable timeCar = (Moveable) Proxy.newProxyInstance(
cls.getClassLoader(), cls.getInterfaces(), timeHandler);
InvocationHandler logHandler = new LogHandler(timeCar);
Moveable logCar = (Moveable) Proxy.newProxyInstance(
cls.getClassLoader(), cls.getInterfaces(), logHandler);
logCar.move();
}
因为你这两个handler里的invoke方法里的method.invoke语句最后都是调的move()方法啊。
你timehandler传的对象是car,之后的loghandler传的timecar,所以你最后logcar调用move()方法的时候的执行顺序是
执行loghandler的invoke方法中method.invoke语句前的部分
进入loghandler的method.invoke方法,这里实际是timehandler的invoke方法,同样先执行method.invoke语句之前的部分
执行timehandler的method.invoke方法,这里实际是car的move()方法
执行timehandler的invoke方法里method.invoke语句之后的部分
执行loghandler的invoke方法里method.invoke语句之后的部分
学习了.
同谢,解答了我的疑问
模式的秘密---代理模式
54912 学习 · 98 问题
相似问题