使用动态代理,在Debug模式下,代理对象显示为null的分析

1、准备一个接口:


2、准备接口的实现类,类中重写接口的方法:


3、准备一个代理对象工厂,提供一个IService类型的成员变量,一个获取IService类型的代理对象的方法:


4、编写测试类,获取代理对象,调用被代理对象的find()方法


5、在代理工厂类中的获取代理对象的方法中,图片中红框的位置上打断点。


6、Debug运行,查看得到的代理对象proxyService,发现其显示为null。但是 程序运行正常!!!!!!!


7、修改获取代理对象方法中的具体增强内容。


8、进行Debug,查看控制台输出内容。


9、可以发现,用鼠标每一次查看proxyService对象,控制台都会输出toString。也就是调用了对象的toString()方法。由于是代理对象,所以会运行自己写的代理的方法,从而会打印出方法的名字。看下图,方法的返回值为null,所以toString()的方法的返回值是null,我们用鼠标查看的时候,会显示是null(如上图)。其本质是调用tostring()方法,运行我们自己写的增强方法,返回一个null值。


10、将上图中的返回值改为其他值,如"我是浩浩",结果如下:

11、由此可见,我们Debug模式查看对象的时候,本质是调用对象的toString()方法,然后将方法的返回值显示出来。就像打印对象System.out.println(service);,本质也是System.out.println(service.toString())。如果将toString()方法的返回值返回,就得到正常的结果,如下图:




12、所以,我们可以发现,Debug模式查看对象的本质是调用toString()方法,将得到的结果显示出来。希望可以帮助到你~~~~~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值