今天利用list添加同一个引用地址的实体类具体代码如下:
问题代码
List<WxMpTemplateMessage> list = new ArrayList<>();
//获取运维角色对应的用户的openId
List<User> userList = userService.list("0");
for (WxMpTemplateMessage mpTemplateMessage : lstWxMpTemplate) {
for (User user : userList) {
auth auth = userAuthService.getModelByUserId(user.getId());
//固定的模板ID通知
mpTemplateMessage.setTemplateId(#模板ID);
//修改对应的openId
mpTemplateMessage.setToUser(auth.getOpenId());
//打印toUser
log.info( mpTemplateMessage.getToUser());
list.add(mpTemplateMessage);
}
}
//输出list添加的参数
for (WxMpTemplateMessage wxTemplate : list) {
log.info(wxTemplate.getToUser());
}
输出结果
message:111oYxdD6AW2CrNRua
message:111oYxdD6K3MsvBt2c
message:111oYxdD6H6MNxDb
//最后输出list的值为list添加的最后一个值
message:333oYxdD6H6MNxDb
message:333oYxdD6H6MNxDb
message:333oYxdD6H6MNxDb
问题解决
List<WxMpTemplateMessage> list = new ArrayList<>();
//获取运维角色对应的用户的openId
List<User> userList = userService.list("0");
for (WxMpTemplateMessage mpTemplateMessage : lstWxMpTemplate) {
for (User user : userList) {
auth auth = userAuthService.getModelByUserId(user.getId());
//固定的模板ID通知
mpTemplateMessage.setTemplateId(#模板ID);
//修改对应的openId
mpTemplateMessage.setToUser(auth.getOpenId());
WxMpTemplateMessage news = BeanHelper.copyProperties(mpTemplateMessage, WxMpTemplateMessage.class);
//打印toUser
log.info( news.getToUser());
list.add(news );
}
}
//输出list添加的参数
for (WxMpTemplateMessage wxTemplate : list) {
log.info(wxTemplate.getToUser());
}
输出结果
message:111oYxdD6AW2CrNRua
message:111oYxdD6K3MsvBt2c
message:111oYxdD6H6MNxDb
//输出正常
message:333oYxdD6AW2CrNRua
message:333oYxdD6K3MsvBt2c
message:33oYxdD6H6MNxDb
总结
这里出现的问题个人理解为当list进行add操作时添加的对象引用地址不能为同一个,否则会改变list里已经添加对象的值,最终导致List类的add()方法每次加入的都是对存放在堆中对象的引用地址。所以要谨记在日常编写过程中需要避免这种情况。