debug的小细节

1

当在IDEA中使用dubug时,引用变量旁边会出现内存地址,是因为idea调用了那个对象的toString方法去显示内存地址

红圈里的内容出现一次,说明IDEA自动调用了一次Son的toString()

这引发了一个现象,当用动态代理增强Son时,会出现运行的时候和dubug时候控制台打印结果不一样

interface BuyBreakFast {//委托类的接口
    public void buyBreakFast();
}
class Son implements BuyBreakFast{//委托类
    public void buyBreakFast() {
        System.out.println("一碗热干面");
    }
}

public class Test {
    public static void main(String[] args) {

        //参数1:委托类的classloader
        //参数2:委托类实现的所有父接口,getInterfaces能获得类对象的全部父接口
        //参数3:invocationHandler,它的invoke()里就是代理对象执行的方法内容
        // (委托类方法的执行 + 增强)
        BuyBreakFast proxy=(BuyBreakFast) Proxy.newProxyInstance(Son.class.getClassLoader(), Son.class.getInterfaces(), new InvocationHandler() {
            /*proxy:是用newProxyInstance生成的代理对象
             *method:是委托类里的方法
             *args:是委托类里的方法参数
             *Object:是委托类里面函数的返回值*/
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("method:"+method.getName());
                Object invoke = method.invoke(new Son(), args);//执行委托类本身要执行的方法
                System.out.println("一碗蛋酒、一份烤肠"); //做额外的增强
                return invoke;
            }
        });
        proxy.buyBreakFast();//执行代理对象方法,就会调用invocationHandler的invoke()
    }
}

当直接运行main,控制台打印效果如下

但是,当用dubug模式

 

原因是:IDEAdubug时自动调用了Son的toString(),相当于proxy.toString()

而动态代码默认增强Son里的所有方法,导致IDEA实际调用了增强的toString,会进入以下代码

 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("method:"+method.getName());
                //下面相当于new Son().toString()
                Object invoke = method.invoke(new Son(), args);//执行委托类本身要执行的方法
                System.out.println("一碗蛋酒、一份烤肠"); //做额外的增强
                return invoke;
}

2、屏蔽断点

dubug模式下,点击这个IDEA会忽略所有断点,运行整个代码

再点击一次还原

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值