Main类未用new运算符实例化AddressDto的实现方式及关联问询
Main类中未使用new获取AddressDto对象的原理
这不是通过关联关系实现的,AddressDto对象的实例化全程都在ApiService内部完成,Main类只是接收了方法返回的现成实例而已,具体过程分两个关键环节:
1. ApiService类的成员变量初始化(被后续覆盖)
在ApiService类中,定义了成员变量:
AddressDto addressDto = new AddressDto();
当你在Main类中执行new ApiService()时,这个成员变量会被自动实例化。不过这个实例在后续getEndereco方法的执行中,会被Jackson创建的新实例覆盖,不是最终返回给Main的那个对象。
2. Jackson通过反射创建AddressDto实例(最终返回的对象)
getEndereco方法中,核心的实例化逻辑在这行代码:
addressDto = mapper.readValue(response.body(), AddressDto.class);
ObjectMapper.readValue方法内部会通过Java反射机制完成AddressDto的实例化:
- 调用AddressDto的无参构造器(如果没显式定义,Java会自动生成默认无参构造)创建对象
- 将接口返回的JSON字符串中的字段值,逐个填充到这个新创建的对象中
- 把填充好的AddressDto对象赋值给成员变量,再通过方法返回给
Main类
Main类中的变量赋值逻辑
Main类里的这行代码:
AddressDto addressDto = apiService.getEndereco("03107040");
只是把ApiService方法返回的已实例化完成的对象赋值给本地变量,并没有触发新的实例化操作,所以不需要写new关键字。
内容的提问来源于stack exchange,提问作者Vini dev
相关产品推荐
相关产品推荐

