隐式的前置依赖
谜题
下面代码有问题吗 ?
Map<String, Object> extraMap; // 声明
Boolean isItemIncluded = isItemIncludingTax(extraMap.toString());
private Boolean isItemIncludingTax(String extra) {
JSONObject itemExtra = JSONObject.parseObject(extra);
return itemExtra.containsKey("tax") && "1".equals(itemExtra.get("tax"));
}
写个简单的单测验证下:
public class MapStringParserTest {
@Test
public void testParse() {
Map<String, Object> map = new HashMap<>();
map.put("a", "{\"outer\":1}");
System.out.println(map);
JSONObject parsed = JSONObject.parseObject(map.toString());
System.out.println(parsed.getString("a"));
}
}
输出结果:
{a={"outer":1}}
com.alibaba.fastjson.JSONException: expect ':' at 0, actual =
at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:290)
抛异常了。
可是,奇怪的是程序运行正常 。 为什么 ? 猜猜看。
谜底
因为有前置依赖。
orderItemFormatBO.setExtraMap(getExtraMap(extra));
protected Map getExtraMap(String extraJson){
if(StringUtils.isNoneEmpty(extraJson)){
try {
return JSON.parseObject(extraJson);
}catch (Exception e){
logger.error("extra fomat not valid:{}", extraJson, e);
}
}
return null;
}
在设置的时候, extraMap 被设置为 JSONObject 对象, 而在调用 toString 的时候,根据多态,调用的是 JSONObject 的多态方法。 这才没出问题。
public String toString() {
return this.toJSONString();
}
好个超距呼应 ! 一旦 extraMap 被重新设置为新的 非 JSONObject 的 Map,就一定会出问题。
别侥幸,虽然逃过一劫, 下次,还能幸运避免吗 ?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了