我代码就加了一行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
川西6天小环线观音桥镇藏传佛教之地每个人都有一场旅行到达目的地并非浓缩在一天之内张驰有度惬意而行。成都桃坪羌寨150km,2。5h桃坪羌寨毕棚沟60km,1。5h(住宿)毕棚沟观音桥200km,3。5h
白塔禅院,一座始建于隋朝陆游盛赞的佛教庙宇头条创作挑战赛冷翠千竿玉,浮岚万幅屏。凭栏避微雨,挈笠遇归僧。残月明楼角,屯云拥塔层。溪山属闲客,随意倚枯藤。800多年前的宋朝,时任蜀州通判的诗人陆游,造访白塔禅院,写下了这首五
是谁帮助清政府镇压了太平天国运动?曾国藩(1811年11月26日1872年3月12日),原名子城,字伯涵,号涤生,湖南湘乡人。于清朝长沙府白杨坪(现属湖南省娄底市双峰县荷叶镇天子坪),谱名传豫,宗圣曾子七十世孙(系
为什么自宋朝开始,都不在长安建都了众所周知,长安是中国的八大古都之一,号称十三朝古都,其实这十三朝有前赵前秦后秦三个仅有三十多年的非大一统国家,还有王莽的新朝这种不被历史承认的朝代,还有东汉西晋两个末代皇帝逃亡后,
外地夫妻遗失20万元黄金饰品,南京民警追查4小时寻回现代快报讯(通讯员陈倩记者季雨)近日,在宿迁经营黄金加工生意的于先生夫妇,从老家来到南京进货,不慎将价值20万元的黄金饰品遗忘在共享单车的车篓里。眼看着20万元的货物就此打了水漂,
1元保终身?魅族憋大招,7小时预订超10万单,网友活久见最近网上关于魅族20系列的预热信息可谓是铺天盖地,虽然准确的发布时间还未官宣,但是3月份发布应该是跑不掉了。魅族时隔两年发布的这款旗舰新机还是受到了不小的关注度,网友对于魅族20系
最新调查英国父母每月52小时在开车送娃的路上环球时报综合报道13的英国父母觉得自己像出租车司机。据英国每日邮报22日报道,一项最新的调查显示,英国父母平均每个月要花52个小时开车接送子女,平均每年接送子女的车程加起来有近50
大运河畔有边城1986年,我作为中国旅游大全山东编写组成员第一次来到临清,找寻撰写实感,搜集一手资料。虽说那时的临清及所在的聊城地区尚属经济欠发达地区,小城风貌也散发着古旧甚至有些破败的气息,但
折叠机开始卷外屏了?曝三星ZFlip5外屏设计很不一般手机中国新闻当前,在全球的折叠屏手机市场上,三星是存在感最高的一家智能手机厂商。根据调研机构Counterpoint的数据,三星占据了全球折叠屏手机九成的销售份额。从2019年折叠
海外旅游局扎堆重启营销,今年出境游能恢复几成?2019年,中国赴泰国旅游的游客人数为1100万左右,占到泰国整体客源的约四分之一,可以说中国是泰国最重要的客源国之一。然而疫情3年,旅游业必然受到影响。就在近期,中国团队出境游恢
春游广元您的寻春旅途中,藏在昭化古城里的这个地方一定不容错过!青砖伴瓦漆,白马踏新泥山花蕉叶暮色丛,染红巾声声歌声传至耳边动听又令人向往生机勃勃的春天搭配上这样的场景会是什么样子呢?咱们一起去藏在昭化古城里的葭萌驿看一看吧!一抹春色中的葭萌驿
建设银行山东省分行未按规定履行客户身份识别义务被罚133万元近日,中国建设银行股份有限公司山东省分行未按规定履行客户身份识别义务与身份不明的客户进行交易或者为客户开立匿名账户假名账户被罚133万元。济银罚决字20224号显示,中国建设银行股
要调整,或将涨价2022年国内成品油零售价第17轮调整,将于本周二晚上(9月6日24时)开启。本轮油价经过前8个工作日统计,原油变化率累计涨幅为5。76,涨幅为230元吨。从当前数据来看,预测油价
中概股回归路径分析近年来,在全球上市资源稀缺中美战略博弈持续深化背景下,内地香港均于2018年前后开始逐渐放松上市要求,适当放宽了同股不同权红筹架构企业的上市限制。在美国证券交易委员会持续发难中概股
油价调整消息今天9月5日,加油站调整后,9295号汽油零售价今天是2022年9月5日,油价调整幅度仍旧处于高位,虽然在这两天突然出现了国际原油价格大幅度下跌,但是并没有影响此次油价调整结果。自进入8月份以来,国内汽柴油价格已经经历了两轮快速
国家发改委实施稳经济一揽子政策的接续政策巩固经济恢复发展的基础9月5日下午,国务院新闻办公室举行国务院政策例行吹风会,介绍稳经济一揽子政策的接续政策措施,并答记者问。国家发展改革委副秘书长杨荫凯介绍,今年5月底以来,各地区各部门按照党中央国务
反弹一触即发反弹一触即发上一个交易日上证指数深成指创业板指全线高开,全天缩量窄幅横盘震荡,成交量7400多亿破万亿。上证指数深成指创业板指均收阴十字星,创业板指已经八连阴。天基互联芯粒概念等板
军工新能源光伏煤炭有色和银行下周如何操作?下面本人将从趋势图解析几个热门板块后市发展和操作策略,下图是本人结合绘图知识和自己多年经验绘出的。本人希望与宝友们一起交流理财知识和经验,一起理财致富!著名投资家威廉。欧奈尔认为,
中国房地产问题解决的关键中国房地产进入下行阶段,价格大幅度下降。受货币周期的影响,很多房企出现了资金困难,连带着与地产相关的产业链进入困难,这些困难扩散到了各行各业,拉低了人们对未来经济的预期,于是进一步
黄金行业如何向未来?来源矿业界今年以来,受疫情地缘政治等多重因素影响,黄金避险保值功能凸显,金价震荡飙升,一度逼近历史最高水平,而后随美联储加息美元升值引发了市场上部分黄金持有者获利回吐,黄金价格从高
中大排量摩托车异军突起多家摩企上半年业绩喜人本报记者吴奕萱见习记者邬霁霞8月29日,钱江摩托发布2022年半年报。报告期内,公司实现营收25。83亿元,同比增长21。20实现净利润2。0亿元,同比增长16。95。除钱江摩托外
河南村镇银行400亿存款不翼而飞,背后黑幕道出了社会的潜规则一个叫做吕奕的河南人,因为爸爸是河南四建集团的负责人。于是顺理成章地一路通过承包高速公路发家致富。然后又通过空手套白狼,把高速公路的收费权抵押给银行,借了几十亿的贷款,利用这些贷款