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

来源:2-3 了解 JDK 动态代理

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

}



写回答 关注

3回答

  • 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语句之后的部分

    windy_...

    谢答,赞同答主的回答,也就是调用logCar.move();时,会首先调用loghandler的invoke方法,之后层层调用,直至调用car.move方法

    2016-02-17 16:00:31

    共 1 条回复 >

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

    学习了.

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

    同谢,解答了我的疑问

模式的秘密---代理模式

本节课程将带你领略Java编程语言中代理模式的奥妙

54912 学习 · 98 问题

查看课程

相似问题