热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java感知调用者_得到方法调用者和java中的位操作符

获取方法的调用者如果你写了一个超级复杂超级大的项目,在项目后期调试修改的时候,突然想知道到底是哪些类调用了ImportantClass中的Importa

获取方法的调用者

如果你写了一个超级复杂超级大的项目,在项目后期调试修改的时候,突然想知道到底是哪些类调用了ImportantClass中的Important方法,你会怎么做呢?

首先,你可能说:我用不到!如果这样的话,到这里你就可以return了。

做法一:最常规有效的做法,使用IDE的全目录全文搜索方法名。当然这样是最有效快速的。但是如果有很多别的类中也定义了Important方法,你就会得到很多垃圾搜索结果。同时你只能搜索到目录下的结果,而对于运行时调用Important方法的地方你就无所适从了。

做法二:这就是我要说的,编写程序,获取方法调用者。最直观的例子就是我们每天都在用了log4j。在执行log.debug或者别的输出日至的操作的时候,它都会按照设定的格式输出类名、方法名、甚至所在的行数。如果我们在Important方法中插入这么一段,就可以知道到底是谁在运行期调用了Important方法了。

在demo程序中有详细的注释和一个完整的例子。我们知道把那段代码拷贝到关系的程序中,修改一下fullClassName就可以了。

ExpandedBlockStart.gif

ContractedBlock.gif/** *//**6a9c071a08f1dae2d3e1c512000eef41.png * 

ExpandedBlockEnd.gif*/None.gif

ExpandedBlockStart.gif

ContractedBlock.gif/** *//**6a9c071a08f1dae2d3e1c512000eef41.png *@authorzangmeng

6a9c071a08f1dae2d3e1c512000eef41.png * 

6a9c071a08f1dae2d3e1c512000eef41.png * 

6a9c071a08f1dae2d3e1c512000eef41.png * 如果我们注意观察一下异常时的输出,我们就知道java调用栈的结构了

6a9c071a08f1dae2d3e1c512000eef41.png * 最后被调用的方法在栈顶。

6a9c071a08f1dae2d3e1c512000eef41.png * 我们这个方法的工作过程就是首先得到调用栈,然后从栈顶向下搜索

6a9c071a08f1dae2d3e1c512000eef41.png * 直到搜索到我们关心的Important类。

6a9c071a08f1dae2d3e1c512000eef41.png * 然后,在这个类的方法后面的,就是我们关心的Important类的important方法的调用者了

6a9c071a08f1dae2d3e1c512000eef41.png * 这时候我们检测第一个不是Important类的类,则这个类必定是调用Important类中

6a9c071a08f1dae2d3e1c512000eef41.png * important方法的类和方法。

6a9c071a08f1dae2d3e1c512000eef41.png * 然后我们将之打印出来,就可以了。

6a9c071a08f1dae2d3e1c512000eef41.png * 同样的道理,我们也可以得到更上一层的调用关系。

6a9c071a08f1dae2d3e1c512000eef41.png * 一直追述到线程的启动方法。

6a9c071a08f1dae2d3e1c512000eef41.png * 

ExpandedBlockEnd.gif*/ExpandedBlockStart.gif

ContractedBlock.gifpublicclassImportant...{

ExpandedSubBlockStart.gif

ContractedSubBlock.gifpublicvoidimportant()...{

6a9c071a08f1dae2d3e1c512000eef41.png        String fullClassName="Important";

6a9c071a08f1dae2d3e1c512000eef41.png//首先得到调用栈6a9c071a08f1dae2d3e1c512000eef41.pngStackTraceElement stack[]=(newThrowable()).getStackTrace();

6a9c071a08f1dae2d3e1c512000eef41.png//然后从栈中向上搜索,直到搜索到我们的Important类。6a9c071a08f1dae2d3e1c512000eef41.pngintix=0;

ExpandedSubBlockStart.gif

ContractedSubBlock.gifwhile(ix

6a9c071a08f1dae2d3e1c512000eef41.png            StackTraceElement frame=stack[ix];

6a9c071a08f1dae2d3e1c512000eef41.png            String cname=frame.getClassName();

ExpandedSubBlockStart.gif

ContractedSubBlock.gifif(cname.equals(fullClassName))...{

6a9c071a08f1dae2d3e1c512000eef41.pngbreak;

ExpandedSubBlockEnd.gif            }6a9c071a08f1dae2d3e1c512000eef41.png            ix++;

ExpandedSubBlockEnd.gif        }6a9c071a08f1dae2d3e1c512000eef41.png//此时ic位置放置的是Important类。ExpandedSubBlockStart.gif

ContractedSubBlock.gifwhile(ix

6a9c071a08f1dae2d3e1c512000eef41.png            StackTraceElement frame=stack[ix];

6a9c071a08f1dae2d3e1c512000eef41.png            String cname=frame.getClassName();

ExpandedSubBlockStart.gif

ContractedSubBlock.gifif(!cname.equals(fullClassName))...{

6a9c071a08f1dae2d3e1c512000eef41.png//第一个费Important类的类就是调用者6a9c071a08f1dae2d3e1c512000eef41.pngSystem.out.println("调用者此方法的类名:"+cname);

6a9c071a08f1dae2d3e1c512000eef41.png                System.out.println("在"+cname+"中调用次方法的方法名:"+frame.getMethodName());

ExpandedSubBlockEnd.gif            }6a9c071a08f1dae2d3e1c512000eef41.png            ix++;

ExpandedSubBlockEnd.gif        }ExpandedSubBlockStart.gif

ContractedSubBlock.gif/** *//**6a9c071a08f1dae2d3e1c512000eef41.png         * some important operation is followed :)

ExpandedSubBlockEnd.gif*/6a9c071a08f1dae2d3e1c512000eef41.png

6a9c071a08f1dae2d3e1c512000eef41.png        System.out.println("__This is an important method,and I care for the infor of the invoker!__");

ExpandedSubBlockEnd.gif    }ExpandedBlockEnd.gif}None.gif

java中的位操作符

因为不常用,所以经常忘记。索性抽时间总结一下,备忘。

对于java这种语言来说,位操作符比较少用到

&:按位与。

|:按位或。

^:按位异或。

~:按位取反。

<

>>&#xff1a;右移&#xff0c;高位插0&#xff0c;否则插1&#xff1b;

>>>&#xff1a;无符号右移&#xff0c;无论正负&#xff0c;高位插0

令人奇怪的是java似乎好像大概说不定没有同或操作符&#xff0c;why?莫非是想让我们把~和^组合一下代替同或操作符&#xff1f;

http://www.matrix.org.cn/resource/article/43/43978_Java_Bitfields_Bitboards.html 这篇文章讲的是相当不错&#xff0c;看了个开头&#xff0c;感觉很有水平&#xff0c;不过篇幅太长&#xff0c;不宜上班时阅读&#xff0c;留作备忘以后慢慢读之。



推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
author-avatar
骨头少校_726
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有