JAVA 源碼 靜態(tài)分析 思考

原文地址

無論是分析一個(gè)大型框架隅俘,還是局部功能绝编,都會(huì)用到這種分析方法风纠。

靜態(tài)分析是指不運(yùn)行代碼查看對(duì)象之間的調(diào)用關(guān)系和實(shí)現(xiàn)方法等內(nèi)容恬砂。這是學(xué)習(xí)優(yōu)秀框架和提升自身技術(shù)功底的好方法碑隆。

分析可以是多角度的:

自上而下:特別適合看某一個(gè)大型的框架技術(shù)拇惋。例如:我們要學(xué)習(xí)netty框架炼七,首先,我們了解這個(gè)是一個(gè)網(wǎng)絡(luò)通訊框架,主要目的是實(shí)現(xiàn)端與端之間的通訊蛮穿。其次庶骄,該框架的主體運(yùn)行邏輯有哪些?例如:netty采用boss和worker線程分別處理TCP事務(wù)的監(jiān)聽和后續(xù)連接后的處理践磅,這些協(xié)議棧的處理采用鏈?zhǔn)教幚淼サ螅瑢?duì)于接收數(shù)據(jù),上一個(gè)處理器處理TCP數(shù)據(jù)協(xié)議府适,下一個(gè)協(xié)議使用上一個(gè)協(xié)議的處理結(jié)果繼續(xù)處理羔飞;對(duì)于發(fā)送數(shù)據(jù),和接收處理順序正好相反檐春。再次逻淌,深入到具體的主要功能和模塊進(jìn)行研究,這樣的方式就是自上而下疟暖。

自下而上:當(dāng)對(duì)一個(gè)大型框架研究遇到瓶頸的時(shí)候卡儒,可以像開采隧道一樣從兩邊挖起,先從具體模塊入手俐巴,研究他的運(yùn)轉(zhuǎn)流程和邏輯骨望。例如:netty里面有ChannelPipeline對(duì)象,該對(duì)象主要實(shí)現(xiàn)了鏈?zhǔn)絽f(xié)議棧的相關(guān)處理欣舵。我們就按照個(gè)方向進(jìn)行研究擎鸠。

抽絲剝繭:當(dāng)遇到一個(gè)復(fù)雜的邏輯很繞的功能或者模塊的時(shí)候,我們需要耐心和細(xì)心的去看缘圈,這個(gè)就是具體問題具體分析了劣光。例如:netty執(zhí)行生命周期ServerBootstrap→group→channel→closeFuture→sync。這個(gè)流程里面我們研究一下group糟把,進(jìn)入group()里面是parentGroupchildGroup的初始化操作赎线,childGroup這個(gè)對(duì)象還是可選的,如果沒有初始化糊饱,默認(rèn)使用parentGroup垂寥,那么parentGroup保存在config里面,config里面持有了ServerBootstrap對(duì)象另锋,當(dāng)調(diào)用config.group()的時(shí)候滞项,實(shí)際就是調(diào)用ServerBootstrap對(duì)象的group()。這么說是不是有點(diǎn)復(fù)雜和難易理解夭坪。我們還可以采用更好的方法文判。首先,關(guān)注相關(guān)對(duì)象

ServerBootstrap室梅、AbstractBootstrap(它里面持有parentGroup對(duì)象)戏仓、ServerBootstrapConfig(config對(duì)象疚宇,被ServerBootstrap對(duì)象持有)、AbstractBootstrapConfig(持有ServerBootstrap對(duì)象)赏殃,而他們之間是子類父類關(guān)系敷待,和相互持有關(guān)系,當(dāng)調(diào)用config.group()的時(shí)候仁热,實(shí)際調(diào)用持有對(duì)象的方法榜揖,這種你中有我,我中有你的關(guān)系在程序?qū)崿F(xiàn)的技巧里面非常常見抗蠢,主要是為了方便查找和使用举哟。雖然沒有采用弱引用,可能使用另外的方法進(jìn)行了處理迅矛,不會(huì)產(chǎn)生內(nèi)存泄露妨猩。

順藤摸瓜:很多時(shí)候,我們不是想要理解一個(gè)功能如何實(shí)現(xiàn)秽褒,可能是需要快速的問題定位册赛,這時(shí)候,快捷高效的方法一般采用順藤摸瓜震嫉,順著問題發(fā)生的原因的這個(gè)主線森瘪,尋找可能出現(xiàn)問題的環(huán)節(jié),中間可能遇到重重的障礙票堵,有些是熟悉的(自己實(shí)現(xiàn)的)扼睬,有些不熟悉(三方或者其他同事實(shí)現(xiàn)的),不要過多的去看不相關(guān)的內(nèi)容悴势,找到問題的癥結(jié)所在窗宇,在想辦法解決。一般來說特纤,問題里面军俊,功能的可復(fù)現(xiàn)的問題比較好解決,性能的內(nèi)存泄露類的長時(shí)間運(yùn)行的捧存,偶發(fā)的沒有找到問題出現(xiàn)規(guī)律的不好解決粪躬。具體問題的難易程度也不一樣,需要按需選擇方法昔穴,順藤摸瓜是大方向镰官。

避重就輕:程序員的特點(diǎn)就是喜歡研究技術(shù),在當(dāng)下研究代碼的時(shí)候吗货,往往跑偏泳唠,本來想要了解一下A功能,結(jié)果看著看著就去研究B功能了宙搬,當(dāng)下要緊的是研究好A功能笨腥,所以拓哺,需要適時(shí)適度的提醒自己,不要跑偏脖母,如果非常感興趣士鸥,可以先記下來,后續(xù)有時(shí)間在研究镶奉。對(duì)于一掃而過就能明白的功能或者問題,也可以及時(shí)研究崭放。

DEMO:好的demo可以讓我們快速的了解原理和功能哨苛,差的demo讓我們誤入歧途,檢驗(yàn)demo的辦法就是閱讀源碼币砂,并且運(yùn)行建峭,并且根據(jù)已有認(rèn)知對(duì)當(dāng)前的使用方法和技巧作出合適評(píng)價(jià)。對(duì)于不好的demo我們應(yīng)該摒棄决摧,對(duì)于好的demo應(yīng)該有價(jià)值的提取和學(xué)習(xí)。

大DEMO:這里的DEMO是泛化的,例如java的jvm是C++的優(yōu)秀學(xué)習(xí)示例挠进,dart語言采用C++做引擎是學(xué)習(xí)C++的優(yōu)秀示例矾麻,redis采用C語言也是C語言的優(yōu)秀學(xué)習(xí)示例,javascript的react框架的響應(yīng)式編程原理是其它語言也應(yīng)該學(xué)習(xí)的優(yōu)秀示例波岛,等等茅坛。這些框架級(jí)別的DEMO我們應(yīng)該多多學(xué)習(xí)。說不定哪天我們也會(huì)用到全部或者部分的內(nèi)容则拷。

代碼片段:好的學(xué)習(xí)方式是學(xué)習(xí)之后總結(jié)贡蓖,而不是學(xué)會(huì)了就完事,不總結(jié)煌茬,后續(xù)時(shí)間長了斥铺,要學(xué)習(xí)又要重新開始,從找資料坛善,找方法晾蜘,所有的曾經(jīng)經(jīng)過的步驟都要再來一遍。所以眠屎,我推薦學(xué)會(huì)一個(gè)框架一個(gè)功能的時(shí)候做總結(jié)笙纤。總結(jié)學(xué)習(xí)資料的獲取组力、學(xué)習(xí)方法的技巧省容、學(xué)習(xí)結(jié)果的驗(yàn)證、自己總結(jié)的總比別人的更加深刻燎字,做一個(gè)demo示例驗(yàn)證所學(xué)技能是否真的正確腥椒。

當(dāng)然如果有有人指導(dǎo)學(xué)習(xí)速度更快阿宅,但是副作用就是提升能力并不明顯,換個(gè)框架笼蛛,速度還是恢復(fù)如初洒放。所以,要兩種方式相結(jié)合來學(xué)習(xí)滨砍。

2021-09-24 11:48:29

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末往湿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惋戏,更是在濱河造成了極大的恐慌领追,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件响逢,死亡現(xiàn)場離奇詭異绒窑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)舔亭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門些膨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钦铺,你說我怎么就攤上這事订雾。” “怎么了矛洞?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵葬燎,是天一觀的道長。 經(jīng)常有香客問我缚甩,道長谱净,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任擅威,我火速辦了婚禮壕探,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘郊丛。我一直安慰自己李请,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布厉熟。 她就那樣靜靜地躺著导盅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪揍瑟。 梳的紋絲不亂的頭發(fā)上白翻,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼滤馍。 笑死岛琼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的巢株。 我是一名探鬼主播槐瑞,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼阁苞!你這毒婦竟也來了困檩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤那槽,失蹤者是張志新(化名)和其女友劉穎悼沿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倦炒,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡显沈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年软瞎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逢唤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涤浇,死狀恐怖鳖藕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情只锭,我是刑警寧澤著恩,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站蜻展,受9級(jí)特大地震影響喉誊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纵顾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一伍茄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧施逾,春花似錦敷矫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蠕搜,卻和暖如春怎茫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妓灌。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國打工遭居, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留啼器,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓俱萍,卻偏偏與公主長得像端壳,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子枪蘑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容