日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

阅读源代码的一点小技巧

發(fā)布時(shí)間:2025/4/5 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阅读源代码的一点小技巧 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 在跟蹤源代碼的時(shí)候,要追著源代碼打斷點(diǎn),不然不知道每一步執(zhí)行到那里。

 有時(shí)候有的方法被多個(gè)地方調(diào)用,這時(shí)無(wú)法確認(rèn)走哪個(gè)方法,改怎么辦呢?

 可以提前通過(guò)打調(diào)用棧的方式把整個(gè)流程弄通,然后在關(guān)鍵點(diǎn)打斷點(diǎn),這樣效率更高。

2.打印方法的調(diào)用鏈(堆棧)兩種方式:

正常方式

@Overridepublic SimWeight computeWeight(float boost, CollectionStatistics collectionStats, TermStatistics... termStats) {/* Exception e=new Exception();e.printStackTrace();*/java.util.Map<Thread, StackTraceElement[]> ts = Thread.getAllStackTraces();StackTraceElement[] ste = ts.get(Thread.currentThread());for (StackTraceElement s : ste) { System.out.println("###################################"+s.getClassName()+"$"+s.getMethodName());} //業(yè)務(wù)邏輯return new DavidStats(field,K_length,KE_length, termStats) ;}

打印結(jié)果

###################################java.lang.Thread$dumpThreads ###################################java.lang.Thread$getAllStackTraces ###################################org.apache.lucene.search.similarities.DavidSimilarity$computeWeight ###################################org.apache.lucene.search.SynonymQuery$SynonymWeight$<init> ###################################org.apache.lucene.search.SynonymQuery$createWeight ###################################org.apache.lucene.search.IndexSearcher$createWeight ###################################org.apache.lucene.search.IndexSearcher$createNormalizedWeight ###################################org.apache.lucene.search.IndexSearcher$search ###################################org.apache.solr.search.SolrIndexSearcher$buildAndRunCollectorChain ###################################org.apache.solr.search.SolrIndexSearcher$getDocListNC ###################################org.apache.solr.search.SolrIndexSearcher$getDocListC ###################################org.apache.solr.search.SolrIndexSearcher$search ###################################org.apache.solr.handler.component.QueryComponent$doProcessUngroupedSearch ###################################org.apache.solr.handler.component.QueryComponent$process ###################################org.apache.solr.handler.component.SearchHandler$handleRequestBody ###################################org.apache.solr.handler.RequestHandlerBase$handleRequest ###################################org.apache.solr.core.SolrCore$execute ###################################org.apache.solr.servlet.HttpSolrCall$execute ###################################org.apache.solr.servlet.HttpSolrCall$call ###################################org.apache.solr.servlet.SolrDispatchFilter$doFilter ###################################org.apache.solr.servlet.SolrDispatchFilter$doFilter ###################################org.eclipse.jetty.servlet.ServletHandler$CachedChain$doFilter ###################################org.eclipse.jetty.servlet.ServletHandler$doHandle ###################################org.eclipse.jetty.server.handler.ScopedHandler$handle ###################################org.eclipse.jetty.security.SecurityHandler$handle ###################################org.eclipse.jetty.server.session.SessionHandler$doHandle ###################################org.eclipse.jetty.server.handler.ContextHandler$doHandle ###################################org.eclipse.jetty.servlet.ServletHandler$doScope ###################################org.eclipse.jetty.server.session.SessionHandler$doScope ###################################org.eclipse.jetty.server.handler.ContextHandler$doScope ###################################org.eclipse.jetty.server.handler.ScopedHandler$handle ###################################org.eclipse.jetty.server.handler.HandlerWrapper$handle ###################################org.eclipse.jetty.server.Server$handle ###################################org.eclipse.jetty.server.HttpChannel$handle ###################################org.eclipse.jetty.server.HttpConnection$onFillable ###################################org.eclipse.jetty.io.AbstractConnection$ReadCallback$succeeded ###################################org.eclipse.jetty.io.FillInterest$fillable ###################################org.eclipse.jetty.io.SelectChannelEndPoint$2$run ###################################org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume$executeProduceConsume ###################################org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume$produceConsume ###################################org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume$run ###################################org.eclipse.jetty.util.thread.QueuedThreadPool$runJob ###################################org.eclipse.jetty.util.thread.QueuedThreadPool$2$run ###################################java.lang.Thread$run

?

異常方式

Exception e=new Exception();e.printStackTrace();

舉例:

@Overridepublic SimWeight computeWeight(float boost, CollectionStatistics collectionStats, TermStatistics... termStats) {Exception e=new Exception();e.printStackTrace();/* java.util.Map<Thread, StackTraceElement[]> ts = Thread.getAllStackTraces();StackTraceElement[] ste = ts.get(Thread.currentThread());for (StackTraceElement s : ste) { System.out.println("###################################"+s.getClassName()+"$"+s.getMethodName());} *///業(yè)務(wù)邏輯return new DavidStats(field,K_length,KE_length, termStats) ;}

打印情況

java.lang.Exceptionat org.apache.lucene.search.similarities.DavidSimilarity.computeWeight(DavidSimilarity.java:91)at org.apache.lucene.search.TermQuery$TermWeight.<init>(TermQuery.java:75)at org.apache.lucene.search.TermQuery.createWeight(TermQuery.java:205)at org.apache.lucene.search.IndexSearcher.createWeight(IndexSearcher.java:738)at org.apache.lucene.search.BooleanWeight.<init>(BooleanWeight.java:56)at org.apache.lucene.search.BooleanQuery.createWeight(BooleanQuery.java:208)at org.apache.lucene.search.IndexSearcher.createWeight(IndexSearcher.java:738)at org.apache.lucene.search.IndexSearcher.createNormalizedWeight(IndexSearcher.java:727)at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:462)at org.apache.solr.search.SolrIndexSearcher.buildAndRunCollectorChain(SolrIndexSearcher.java:215)at org.apache.solr.search.SolrIndexSearcher.getDocListNC(SolrIndexSearcher.java:1602)at org.apache.solr.search.SolrIndexSearcher.getDocListC(SolrIndexSearcher.java:1417)at org.apache.solr.search.SolrIndexSearcher.search(SolrIndexSearcher.java:584)at org.apache.solr.handler.component.QueryComponent.doProcessUngroupedSearch(QueryComponent.java:1435)at org.apache.solr.handler.component.QueryComponent.process(QueryComponent.java:375)at org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:295)at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:177)at org.apache.solr.core.SolrCore.execute(SolrCore.java:2503)at org.apache.solr.core.QuerySenderListener.newSearcher(QuerySenderListener.java:74)at org.apache.solr.core.SolrCore.lambda$17(SolrCore.java:2275)at java.util.concurrent.FutureTask.run(FutureTask.java:266)at org.apache.solr.common.util.ExecutorUtil$MDCAwareThreadPoolExecutor.lambda$0(ExecutorUtil.java:188)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)at java.lang.Thread.run(Thread.java:745)

3.通過(guò)時(shí)序圖將上面的調(diào)用鏈路畫(huà)出來(lái)(示例,非嚴(yán)格按照上面的邏輯)

總結(jié):

? ? 閱讀源碼總體上是一個(gè)長(zhǎng)期的過(guò)程,每次閱讀想要有所收獲,就需要留下一些東西,比如有人寫(xiě)博客,有人記日志等等,如果不做任何準(zhǔn)備,盲目的去閱讀代碼,往往今天讀明天忘,浪費(fèi)了大量的時(shí)間反而沒(méi)有相應(yīng)的收獲。

通過(guò)梳理調(diào)用鏈的方式可以加深對(duì)源碼的理解,通過(guò)流程圖的梳理,讓下次源碼閱讀更有效率,有圖有真相。

?

轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/10594488.html

總結(jié)

以上是生活随笔為你收集整理的阅读源代码的一点小技巧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。