1、准备一个接口:

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

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

使用动态代理,在Debug模式下,代理对象显示为null的分析_程序运行_02

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

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

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

使用动态代理,在Debug模式下,代理对象显示为null的分析_程序运行_04

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

使用动态代理,在Debug模式下,代理对象显示为null的分析_程序运行_05

 

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

使用动态代理,在Debug模式下,代理对象显示为null的分析_程序运行_06

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

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

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

使用动态代理,在Debug模式下,代理对象显示为null的分析_程序运行_08

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

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

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

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

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

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

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

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