阅读源代码的一点小技巧
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)題。
- 上一篇: 知乎推荐页 Ranking 构建历程和经
- 下一篇: zookeeper curator 服务