代理对象地址值问题新思考

代理对象地址值问题新思考

问题回顾:

为userService找的代理对象proxy,打印的地址值与userService一样!!!

UserService类:

代理对象地址值问题新思考

ProxyFactoryByJDK代理类:

代理对象地址值问题新思考

UserTest测试类:

代理对象地址值问题新思考

控制台打印:

代理对象地址值问题新思考

动态代理对象时运行时期动态创建的代理对象,和目标对象那不是用一个对象。对于这一点,== 与 equals 都为fasle已经给出了证据。那么为什么直接打印,目标对象和proxy对象内容完全相等呢?

首先,直接打印一个对象,实际上是调用对象的toString方法!!!

代理对象地址值问题新思考

toString()和上面控制台的输出一对比,不难发现,proxy输出打印的其实是userService的toString()返回值字符串。

为了证明,重写UserService的toString()

代理对象地址值问题新思考

控制台打印:

代理对象地址值问题新思考

重写UserService的toString()后,直接打印proxy输出的也是UserService的toStirng()返回值,证明直接打印proxy,前置增强和后置增强都打印,实际上是调用目标对象的toString(),其实就是对toString()的增强。

调用目标对象的toString(),其实就是对toString()的增强。