1. 在跟踪源代码的时候,要追着源代码打断点,不然不知道每一步执行到那里。

 有时候有的方法被多个地方调用,这时无法确认走哪个方法,改怎么办呢?

 可以提前通过打调用栈的方式把整个流程弄通,然后在关键点打断点,这样效率更高。

2.打印方法的调用链(堆栈)两种方式:

正常方式

 @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());} //业务逻辑return new DavidStats(field,K_length,KE_length, termStats) ;}

打印结果

###################################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());} *///业务逻辑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.通过时序图将上面的调用链路画出来(示例,非严格按照上面的逻辑)

总结:

阅读源码总体上是一个长期的过程,每次阅读想要有所收获,就需要留下一些东西,比如有人写博客,有人记日志等等,如果不做任何准备,盲目的去阅读代码,往往今天读明天忘,浪费了大量的时间反而没有相应的收获。

通过梳理调用链的方式可以加深对源码的理解,通过流程图的梳理,让下次源码阅读更有效率,有图有真相。

转载于:https://www.cnblogs.com/davidwang456/p/10594488.html

阅读源代码的一点小技巧相关推荐

  1. java程序阅读技巧_Java程序员阅读源码的小技巧,原来大牛都是这样读的,赶紧看看!...

    1.Quick Type Hierarchy 快速查看类继承体系. 快捷键:Ctrl + T 查看类很多人可能都知道,可源码阅读的时候更多用来查看方法体系更重要,可以方便快速的定位到方法的实现类.如: ...

  2. 在开发中总结的一点小技巧

    在平时的开发中,我们总会遇到各种各样的问题,在我们技术还不行的时候,也许不是什么大问题,但是一旦技术逐渐成熟,所写的程序逐渐变大了,那么我们就会面临着越来越多的挑战.1.如何快速认识一个新类及其方法 ...

  3. cocos2d-x 关于旋转和移动的一点小技巧

    你犯困吗,恩,给你讲个笑话提提神- 一對情侶去從林遊玩,被食人族捉住.食人族首領心情很好,說你們如果想活命,就吃掉對方的大便.在他們回來的路上,女人終於忍不住停下,坐到石頭上哭起來.男人摟住她的肩膀. ...

  4. 使用VM虚拟机的一点小技巧

    今天想为朋友弄一个虚拟机系统文件,这样就可以直接拷贝过去,直接让他用了.哪成想电脑里的系统镜像文件不能用,也不知道是不是VM不支持,反正怎么着也引导不起来了. 无奈只好用硬件光驱来装虚拟系统,把200 ...

  5. 减少科研文章写作错误的一点小技巧

  6. java的循环中try catch的一点小技巧

    在循环中如果有异常被catch住,但是同时不想中断循环可以这样: for(int i=-1;i<3;i++){      try { System.out.println("resul ...

  7. 在ASP.NET使用javascript的一点小技巧

    我们在进行ASP.NET开发时,经常会用到一些javascript脚本,比如: private void Button1_Click(object sender, System.EventArgs e ...

  8. 管理Win2003sp1防火墙的一点小技巧

    在公司共享网络的服务器上2003SP1的补丁,系统自动重新设置防火墙,使得很多软件在局域网都无法访问服务器,尝试关闭防火墙然而系统把所有网络适配器的防火墙都关了,这是我们不想看到的,又试了试还有另外一 ...

  9. 对于shell脚本参数获取时的一点小技巧

    问题如下: 根据脚本参数的个数$#进行一个循环,在依次输出每个参数$1 $2 $3...... 我有一个循环变量i $i 取到这时的i为1,我想使用这个1再去调用$1,也是就是打印出第一个参数 就是$ ...

最新文章

  1. 一款全屏图片滑动js 插件 超快捷
  2. Windows Phone访问web service和WCF服务
  3. Android--面试题整理(二)
  4. 【深度学习的数学】初始权重和偏置参数对模型训练非常重要!(预训练模型、预训练文件、初始权重)
  5. js一键批量打印_js批量打印文件夹
  6. 宏信建发IT信息部门-大数据-HR面试
  7. ArcGis中这些你真的清楚么
  8. ORA-19809: limit exceeded for recovery files
  9. 看完尤雨溪338条知乎回答后,我突然找到了前进的方向
  10. linux video属性_Linux 下Video 的制作方法
  11. 你还在用notifyDataSetChanged?
  12. 整理了js数组去重4种方法
  13. [python]getopt模块的使用介绍
  14. linux远程桌面速度,【图片】linux下哪种远程桌面服务最快?_linux吧_百度贴吧
  15. 阿里云轻量级服务器上JDK及tomcat部署配置
  16. 【使用工具推荐】使用什么录像软件录制屏幕
  17. sqlserver数据库系统概论习题集
  18. Tomcat6 无法登陆Tomcat Manager
  19. PS 将图片渐变透明
  20. 奇特的一生 柳比歇夫坚持56年的“时间统计法” - 读后感

热门文章

  1. 二叉树中如何求根节点到任意节点的路径?
  2. spring boot第二讲
  3. mysql 实现ztree_简单Ztree的实现————不连接数据库版
  4. oracle不维护java_宣布 Java 8 停止维护后,Oracle 又毙掉了 JavaOne!
  5. java求一个数的阶乘_Java如何使用方法计算一个数字的阶乘值?
  6. 如何根据原理图画封装_如何根据业务封装自己的功能组件
  7. 2009年计算机二级c语言考试真题,2009年3月全国计算机二级C语言考试真题.doc
  8. 一行代码实现strlen
  9. C++继承中的构造与析构
  10. C#控制台程序生成文件分析