热门标签 | 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;留作备忘以后慢慢读之。



推荐阅读
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • publicclassBindActionextendsActionSupport{privateStringproString;privateStringcitString; ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 一、Advice执行顺序二、Advice在同一个Aspect中三、Advice在不同的Aspect中一、Advice执行顺序如果多个Advice和同一个JointPoint连接& ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 本文探讨了如何通过优化 DOM 操作来提升 JavaScript 的性能,包括使用 `createElement` 函数、动画元素、理解重绘事件及处理鼠标滚动事件等关键主题。 ... [详细]
  • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
  • 利用 Calcurse 在 Linux 终端高效管理日程与任务
    对于喜爱使用 Linux 终端进行日常操作的系统管理员来说,Calcurse 提供了一种强大的方式来管理日程安排、待办事项及会议。本文将详细介绍如何在 Linux 上安装和使用 Calcurse,帮助用户更有效地组织工作。 ... [详细]
  • Beetl是一款先进的Java模板引擎,以其丰富的功能、直观的语法、卓越的性能和易于维护的特点著称。它不仅适用于高响应需求的大型网站,也适合功能复杂的CMS管理系统,提供了一种全新的模板开发体验。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 本文详细介绍了JQuery Mobile框架中特有的事件和方法,帮助开发者更好地理解和应用这些特性,提升移动Web开发的效率。 ... [详细]
  • Requests库的基本使用方法
    本文介绍了Python中Requests库的基础用法,包括如何安装、GET和POST请求的实现、如何处理Cookies和Headers,以及如何解析JSON响应。相比urllib库,Requests库提供了更为简洁高效的接口来处理HTTP请求。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
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社区 版权所有