先上代码:
接口和实现类
public interface Movie {
void play();
}
public class NoVipMovie implements Movie {
public void play(){
System.out.println("播放非vip电影");
}
}
InvocationHandler的实现类
public class MyInvocationHandler implements InvocationHandler {
private Object object;
public MyInvocationHandler(Object object){
this.object=object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
ad();
Object invoke = method.invoke(object, args);
return invoke;
}
public void ad(){
System.out.println("播放广告");
}
}
测试方法:
public class Test {
public static void main(String[] args) {
Movie movie = new NoVipMovie();
MyInvocationHandler myInvocationHandler = new MyInvocationHandler(movie);
Movie proxyObject =(Movie) Proxy.newProxyInstance(NoVipMovie.class.getClassLoader(),NoVipMovie.class.getInterfaces(),myInvocationHandler);
proxyObject.play();
}
}
正常运行结果:
播放广告
播放非vip电影
debug模式下,断点运行结果:
播放广告
播放广告
播放广告
播放广告
播放非vip电影
播放广告
播放广告
播放广告
偶然间发现输出的内容竟然不一样,于是深入了一下找问题,发现只有idea环境下单步调试会出现,原因是调用了toString方法。
在被代理类上重写toString方法,断点执行。
结果:
tostring
tostring
播放广告
tostring
播放广告
tostring
tostring
tostring
tostring
播放广告
tostring
播放广告
tostring
tostring
tostring
tostring
播放非vip电影
tostring
播放广告
tostring
tostring
tostring
播放广告
tostring
tostring
tostring
tostring
播放广告
tostring
总结:idea会在单步调试时执行toString方法,从而导致invoke方法反复执行。