在idea下jdk动态代理时反复输出的问题

先上代码:

接口和实现类

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方法反复执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值