为了账号安全,请及时绑定邮箱和手机立即绑定

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

}



正在回答

3 回答

因为你这两个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语句之后的部分

4 回复 有任何疑惑可以回复我~
#1

windy_yong 提问者

谢答,赞同答主的回答,也就是调用logCar.move();时,会首先调用loghandler的invoke方法,之后层层调用,直至调用car.move方法
2016-02-17 回复 有任何疑惑可以回复我~

学习了.

0 回复 有任何疑惑可以回复我~

同谢,解答了我的疑问

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信