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会忽略所有断点,运行整个代码
再点击一次还原