问答详情
源自:2-3 了解 JDK 动态代理

logHandler调用的是move方法,但为什么timeHandler调用的也是move方法

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();

}



提问者:windy_yong 2016-02-17 15:02

个回答

  • Frostmourn
    2016-02-17 15:48:46
    已采纳

    因为你这两个handler里的invoke方法里的method.invoke语句最后都是调的move()方法啊。

    你timehandler传的对象是car,之后的loghandler传的timecar,所以你最后logcar调用move()方法的时候的执行顺序是

    1. 执行loghandler的invoke方法中method.invoke语句前的部分

    2. 进入loghandler的method.invoke方法,这里实际是timehandler的invoke方法,同样先执行method.invoke语句之前的部分

    3. 执行timehandler的method.invoke方法,这里实际是car的move()方法

    4. 执行timehandler的invoke方法里method.invoke语句之后的部分

    5. 执行loghandler的invoke方法里method.invoke语句之后的部分

  • 杜牧之
    2017-03-08 20:29:02

    学习了.

  • 冬唐
    2016-07-28 23:21:18

    同谢,解答了我的疑问