游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

我代码就加了一行log日志,结果引发了P1的线上事故

  线上事故回顾
  前段时间新增一个特别简单的功能,晚上上线前review代码时想到公司拼搏进取的价值观临时加一行log日志,觉得就一行简单的日志基本上没啥问题,结果刚上完线后一堆报警,赶紧回滚了代码,找到问题删除了添加日志的代码,重新上线完毕。情景还原
  定义了一个CountryDTOpublicclassCountryDTO{privateStringcountry;publicvoidsetCountry(Stringcountry){this。countrycountry;}publicStringgetCountry(){returnthis。country;}publicBooleanisChinaName(){returnthis。country。equals(中国);}}复制代码
  定义测试类FastJonTestpublicclassFastJonTest{TestpublicvoidtestSerialize(){CountryDTOcountryDTOnewCountryDTO();StringstrJSON。toJSONString(countryDTO);System。out。println(str);}}复制代码
  运行时报空指针错误:
  通过报错信息可以看出来是序列化的过程中执行了isChinaName()方法,这时候this。country变量为空,那么问题来了:序列化为什么会执行isChinaName()呢?引申一下,序列化过程中会执行那些方法呢?源码分析
  通过debug观察调用链路的堆栈信息
  调用链中的ASMSerializer1CountryDTO。write是FastJson使用asm技术动态生成了一个类ASMSerializer1CountryDTO,
  asm技术其中一项使用场景就是通过到动态生成类用来代替java反射,从而避免重复执行时的反射开销JavaBeanSerizlier序列化原理
  通过下图看出序列化的过程中,主要是调用JavaBeanSerializer类的write()方法。
  而JavaBeanSerializer主要是通过getObjectWriter()方法获取,通过对getObjectWriter()执行过程的调试,找到比较关键的com。alibaba。fastjson。serializer。SerializeConfigcreateJavaBeanSerializer方法,进而找到com。alibaba。fastjson。util。TypeUtilscomputeGetterspublicstaticListFieldInfocomputeGetters(Classlt;?clazz,JSONTypejsonType,MapString,StringaliasMap,MapString,FieldfieldCacheMap,booleansorted,PropertyNamingStrategypropertyNamingStrategy){省略部分代码。。。。Method〔〕methodsclazz。getMethods();for(Methodmethod:methods){省略部分代码。。。if(method。getReturnType()。equals(Void。TYPE)){continue;}if(method。getParameterTypes()。length!0){continue;}省略部分代码。。。JSONFieldannotationTypeUtils。getAnnotation(method,JSONField。class);省略部分代码。。。if(annotation!null){if(!annotation。serialize()){continue;}if(annotation。name()。length()!0){省略部分代码。。。}}if(methodName。startsWith(get)){省略部分代码。。。}if(methodName。startsWith(is)){省略部分代码。。。}}}复制代码
  从代码中大致分为三种情况:JSONField(。serializefalse,namexxx)注解getXxx():get开头的方法isXxx():is开头的方法序列化流程图
  示例代码case1:JSONField(serializefalse)case2:getXxx()返回值为voidcase3:isXxx()返回值不等于布尔类型case4:JSONType(ignoresxxx)JSONType(ignoresotherName)publicclassCountryDTO{privateStringcountry;publicvoidsetCountry(Stringcountry){this。countrycountry;}publicStringgetCountry(){returnthis。country;}publicstaticvoidqueryCountryList(){System。out。println(queryCountryList()执行!!);}publicBooleanisChinaName(){System。out。println(isChinaName()执行!!);returntrue;}publicStringgetEnglishName(){System。out。println(getEnglishName()执行!!);returnlucy;}publicStringgetOtherName(){System。out。println(getOtherName()执行!!);returnlucy;}case1:JSONField(serializefalse)JSONField(serializefalse)publicStringgetEnglishName2(){System。out。println(getEnglishName2()执行!!);returnlucy;}case2:getXxx()返回值为voidpublicvoidgetEnglishName3(){System。out。println(getEnglishName3()执行!!);}case3:isXxx()返回值不等于布尔类型publicStringisChinaName2(){System。out。println(isChinaName2()执行!!);returnisChinaName2;}}复制代码
  运行结果为:isChinaName()执行!!getEnglishName()执行!!{chinaName:true,englishName:lucy}复制代码代码规范
  可以看出来序列化的规则还是很多的,比如有时需要关注返回值,有时需要关注参数个数,有时需要关注JSONType注解,有时需要关注JSONField注解;当一个事物的判别方式有多种的时候,由于团队人员掌握知识点的程度不一样,这个方差很容易导致代码问题,所以尽量有一种推荐方案。这里推荐使用JSONField(serializefalse)来显式的标注方法不参与序列化,下面是使用推荐方案后的代码,是不是一眼就能看出来哪些方法不需要参与序列化了。publicclassCountryDTO{privateStringcountry;publicvoidsetCountry(Stringcountry){this。countrycountry;}publicStringgetCountry(){returnthis。country;}JSONField(serializefalse)publicstaticvoidqueryCountryList(){System。out。println(queryCountryList()执行!!);}publicBooleanisChinaName(){System。out。println(isChinaName()执行!!);returntrue;}publicStringgetEnglishName(){System。out。println(getEnglishName()执行!!);returnlucy;}JSONField(serializefalse)publicStringgetOtherName(){System。out。println(getOtherName()执行!!);returnlucy;}JSONField(serializefalse)publicStringgetEnglishName2(){System。out。println(getEnglishName2()执行!!);returnlucy;}JSONField(serializefalse)publicvoidgetEnglishName3(){System。out。println(getEnglishName3()执行!!);}JSONField(serializefalse)publicStringisChinaName2(){System。out。println(isChinaName2()执行!!);returnisChinaName2;}}复制代码三个频率高的序列化的情况
  以上流程基本遵循发现问题原理分析解决问题升华(编程规范)。围绕业务上:解决问题如何选择一种好的额解决方案好的解决方式如何扩展n个系统应用;围绕技术上:解决单个问题,顺着单个问题掌握这条线上的原理。
  作者:老鹰汤
  链接:https:juejin。cnpost7156439842958606349

荀彧为什么老年背叛曹操?荀彧为什么老年背叛曹操?曹操为何要杀荀彧?其实是同一个问题,我来一并回答。荀彧的下场公元212年,荀彧因病在家修养。曹操派人送来一个盒子,荀彧打开一看,竟是空无一物。荀彧……胃糜烂想要好,除了吃药,还要注意这些胃糜烂通常是指胃粘膜的破溃及损伤,胃糜烂一般局限于胃粘膜的上皮层,未到肌层。胃糜烂是胃溃疡的前奏,所以我们在日常生活中对胃糜烂也不能掉以轻心,而要想治好胃糜烂,除了吃药,……为何大部分旅行爱好者,下火车后都去洗浴中心过夜,而不去酒店?不知从什么时候开始,酒店开始不香了,不少游客刚下火车,不会到酒店过夜,反而去一旁的洗浴中心,这到底是为什么呢?(此处已添加小程序,请到今日头条客户端查看)下面让洗浴中心的……唐朝有哪些有趣的冷知识?谢邀回答问题。问:唐朝有哪些有趣的冷知识?大唐盛世国泰民安,人们的生活习惯也有了变化,一些嗜好也适时而生。(《虢国夫人游春图》局部)俗话说:民以食为天。还说:……秦始皇被抹黑了,大一统算不算是仁慈爱民的体现?秦始皇不是抺黑的,而是秦始皇本身就是残酷不仁的暴君,他的统一是为了皇权,并不是为了天下百姓,对天下百姓不仁,不但他黑的,而是最坏的独裁暴君!凡是独裁暴君只关心权利不关心人民生活……霍去病为何敢杀李敢?看看他的靠山是谁,可以说天下间没有人敢惹大汉王朝在华夏历史上可以说是非常辉煌的一个朝代了,正是因为大汉非常强盛,于是我们后人都觉得说起这段历史的时候非常光荣,而现在的汉字和汉服等也是起源于那时候。我们在说到西汉的时候……英超纽卡有了沙特金主,球迷狂喜来源:环球网【环球时报驻英国特约记者纪双城】英超上周宣布,沙特公共投资基金(PIF)完成对英超纽卡斯尔联队的收购,迈克阿什利14年的纽卡斯尔联队老板生涯也随之结束。对于此……周总理病危,最后的任务是力挺邓小平,最后的嘱托是祖国统一大业1972年5月,周总理在一次常规的身体检查中,被医生惊讶地发现了癌细胞。在那个特殊的年代里,周总理面临着数不清的磨难,长时间的高负荷工作让他心力交瘁,病情不断恶化。……中国女排目前的四大未解之谜朱婷何时做手术?张常宁准备退役?中国女排超级联赛正在如火如荼地进行,一众00后新秀,甚至05后小将开始崭露头角,让人感叹光阴的无穷力量。不过,恋旧的球迷还是非常关心几位超白金一代球员、教练的状况,而他们的动态……曾多次背叛党中央,刑场上含笑赴死,后被民政部追封为烈士从古至今,我们都清楚地知道,当汉奸卖国贼都是没有什么好下场的。然而,却有一位汉奸,曾背叛党组织,国民党数次想要暗杀他,赴死前却在刑场上露出诡异的笑容,其中缘由不得而知。朱……喝水是越多越好吗?喝水过多的人可能会有这些反应近期,网络上有不少关于感染新冠发热后的居家治疗小妙招。其中,多喝水成了大家认为最简单可操作的一个方法。喝水确实能给我们带来很多好处比如:1、对泌尿系统的好处,饮水多……尘埃落定!申花本轮中超点球被取消冤不冤,回放镜头告诉球迷答案日前,申花与亚泰的中超第二阶段的首轮正式打响。这场比赛,申花原本可以靠着一个点球吹罚,取得1比0领先。当时,申花飞翼曹赟定跟亚泰后卫在小禁区内拼抢,曹赟定顺势倒地。主裁马宁第一……
尸毒真实存在吗?毒性究竟有多厉害,看看辛追夫人墓就知道了随着近年来盗墓类小说的兴起,人们对古代陵墓产生了比之前更为浓烈的兴趣。在这些小说和影视作品当中,盗墓之人都会遇到许多玄幻离奇,令人匪夷所思的事情。正所谓危机与财富并存,为……价值2亿的西汉金龟印,被老农妻子咬了一口,如今已是镇馆之宝在朝代更迭的过程中,难免会有一些文物因为战乱、倒卖等原因而遗失,未能顺利地传承下来。不过,也有许多幸运儿,会在无意间偶遇这些宝贝,重庆农民刘定权就是其中一个。一、土里挖出……新城战役优待俘虏的开端文大福公众号:魏武挥鞭刊误:各位读者,在下当初写共产党内上山设想最早提出一文时,曾认为朱德虽在毛泽东之前提出过上山设想,但并没有亲身实践。这一观点得到一位热心……瞿秋白结局吃喝完毕唱着歌走到刑场,盘足而坐笑说此地很好(说历史的女人第8期)伟大的革命领路人瞿秋白的一生,是在血与火的洗礼中度过的一生,是不屈不挠战斗的一生,但是无论在怎样的时刻或历史关头,他都保持了乐观的革命主义精神,比如……宋时轮战前会议负气离场,毛主席下令应予撤职,显示智慧1948年7月14日,国共内战已接近尾声,解放战争来到了第三个年头。毛主席开始筹备了进攻济南的计划,他指示华东野战军:济南势在必夺,条件已经成熟。16日,又电报指示粟裕:要抓住……冬天早餐别只会吃水煮蛋了!换成这3样,养肾补气血睡得更香水煮蛋,以做法简单、营养价值全面而著称,向来是国人早餐餐桌上的热门选手。但是,天天都吃水煮蛋实在是吃厌了,但又不想舍弃这份营养,那该怎么办呢?别急,养生君这就给大家……111年前广州起义的革命党人泪流满面与亲人诀别后毅然慷慨赴死1911年4月27日(农历3月29日)下午5时30分,黄兴率130余名敢死队员直扑两广总督署,发动了中国同盟会的第十次武装起义广州起义。起义遭到水师提督李准率领的北洋军镇压而不……直屏与曲面屏怎么选?雷军解释小米13系列区别,都是高端旗舰!熟悉手机行业的朋友都知道,经常有一些朋友因为直屏与曲面屏哪个更好吵到不可开交,大家都无法说服对方接受自己的观点。为了解决这个矛盾,雷军想出了一个好主意,小米13系列分别采用两种……鲁迅他和弟弟打架,晚年从来不和睦他对周作人评价是准确的1924年6月11日,43岁的鲁迅和他的亲弟弟39岁的周作人打了一架。这两个人之间的争吵很激烈。后来,周作人直接拿起一个一尺多高的香炉,朝鲁迅的头上砸去。鲁迅彻底被激怒了,他抓……最嚣张的王室成员皇室已经存在了几个世纪,但它肯定不仅仅是鞠躬、屈膝礼、近亲繁殖和皇冠上的珠宝。据《国家地理》报道,等级世袭的概念可以追溯到公元前660年,当时传说日本第一位天皇神武建立了他的皇……最闪亮的坐标一马三司令满门英烈骨抗日留英名1938年10月,八路军山东抗日游击第三、四、八支队负责人合影。左起韩明柱、姚仲明、霍士廉、廖容标、马耀南、张文通。一马三司令,得了抗日病,齐心打鬼子,保卫老百姓。这首民……关羽斩首颜良,自封一个好汉,被曹军擒获时没法赢得关键在三国的24名将军中,前5位超级猛将比张飞强大。关羽曾经告诉曹操,如果我的弟兄翼德在百万军中取敌人的第一名将军,例如安若泰山,关羽的勇武曹操是众所周知的。斩首颜良的丑陋行为是一……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网