`
deepnighttwo
  • 浏览: 52144 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

 
阅读更多

获取方法的调用者

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

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

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

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

/***//**
*
*/


/***//**
*
@authorzangmeng
*
*
*如果我们注意观察一下异常时的输出,我们就知道java调用栈的结构了
*最后被调用的方法在栈顶。
*我们这个方法的工作过程就是首先得到调用栈,然后从栈顶向下搜索
*直到搜索到我们关心的Important类。
*然后,在这个类的方法后面的,就是我们关心的Important类的important方法的调用者了
*这时候我们检测第一个不是Important类的类,则这个类必定是调用Important类中
*important方法的类和方法。
*然后我们将之打印出来,就可以了。
*同样的道理,我们也可以得到更上一层的调用关系。
*一直追述到线程的启动方法。
*
*/

publicclassImportant...{
publicvoidimportant()...{
StringfullClassName
="Important";
//首先得到调用栈
StackTraceElementstack[]=(newThrowable()).getStackTrace();
//然后从栈中向上搜索,直到搜索到我们的Important类。
intix=0;
while(ix<stack.length)...{
StackTraceElementframe
=stack[ix];
Stringcname
=frame.getClassName();
if(cname.equals(fullClassName))...{
break;
}

ix
++;
}

//此时ic位置放置的是Important类。
while(ix<stack.length)...{
StackTraceElementframe
=stack[ix];
Stringcname
=frame.getClassName();
if(!cname.equals(fullClassName))...{
//第一个费Important类的类就是调用者
System.out.println("调用者此方法的类名:"+cname);
System.out.println(
""+cname+"中调用次方法的方法名:"+frame.getMethodName());
}

ix
++;
}

/***//**
*someimportantoperationisfollowed:)
*/


System.out.println(
"__Thisisanimportantmethod,andIcarefortheinforoftheinvoker!__");
}

}

java中的位操作符


因为不常用,所以经常忘记。索性抽时间总结一下,备忘。
对于java这种语言来说,位操作符比较少用到
&:按位与。
|:按位或。
^:按位异或。
~:按位取反。
<<:左移,高位插0,否则插1;
>>:右移,高位插0,否则插1;
>>>:无符号右移,无论正负,高位插0
令人奇怪的是java似乎好像大概说不定没有同或操作符,why?莫非是想让我们把~和^组合一下代替同或操作符?
http://www.matrix.org.cn/resource/article/43/43978_Java_Bitfields_Bitboards.html 这篇文章讲的是相当不错,看了个开头,感觉很有水平,不过篇幅太长,不宜上班时阅读,留作备忘以后慢慢读之。

<!-- END content -->
分享到:
评论

相关推荐

    JAVA中的方法重写与方法重载区别

    JAVA 中的方法重写和方法重载是两个重要的概念,在面向对象程序设计语言中尤为重要。方法重写和方法重载都是多态性的体现,但它们之间有着本质的区别。 方法重写(Override)是指在子类中定义的一个方法,其名称、...

    java 面试题 占位符

    封装涉及类和对象,继承允许子类继承父类的属性和方法,多态则提供了代码的灵活性和可扩展性。 3. **集合框架**:Java集合框架包括List、Set、Map等接口及其实现类,如ArrayList、LinkedList、HashSet、HashMap等。...

    JAVA_API1.6文档(中文)

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    NDK_C调用java demo

    在我们的"NDK_C调用Java demo"中,我们将主要关注后者:从C代码调用Java方法。 ### 2. 创建Java方法 首先,在Java层创建一个需要被调用的方法。例如,我们可以创建一个名为`MainActivity`的类,并在其中定义一个名...

    java7 32+64位安装包下载

    在本压缩包中,包含了32位和64位的Java运行时环境(JRE),分别为`jre-7u65-windows-i586`和`jre-7u65-windows-x64`。 1. **JRE(Java Runtime Environment)**:JRE是Java应用程序执行所需的核心组件,包括Java...

    Java技术与Java虚拟机

    JVM下面是移植接口,包括适配器和Java操作系统,适配器负责实现JVM与不同操作系统之间的交互。 JVM的体系结构包括类装载子系统和运行引擎,前者负责加载具有指定名称的类或接口,后者执行已加载类中的指令。JVM的...

    JAVA面试题

    面向对象编程的核心概念在于通过“类”来定义对象的行为和状态,即属性和方法;对象则是类的一个实例,可以拥有自己的状态并执行行为;方法是对象能够执行的功能,封装在类中,用于处理数据和实现逻辑。 ### Java中...

    java api最新7.0

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    JavaWord类库操作API_Free Spire.Doc for Java_5.1.0

    1.功能: ... 1.2 文档操作:超链接添加、编辑、删除、读取;...lib文件夹下包含了用于在java程序中的Spire.Doc.jar文件,在项目程序中调用接口方法时,需要导入该jar文件;doc文件下包含了所有类及方法的说明解释等。

    java中文手册全部中文解释

    - **操作符与表达式**:包括算术、比较、逻辑、赋值等操作符,它们用于组合变量和常量,形成表达式,进行计算或判断。 - **控制结构**:包括条件语句(if-else)、循环(for、while、do-while)、跳转语句(break...

    Java 自定义方法

    自定义方法”压缩包文件中,很可能包含了几个Java源文件,每个文件都包含一些自定义方法,可能是为了演示如何使用方法和方法重载。初学者可以通过阅读和运行这些代码来加深对Java方法的理解,并进行实践操作。 总结...

    实验三:Java类与对象

    访问修饰符(public, private, protected, default)控制类、成员变量和方法的可见性。例如,`Monkey`类中的`name`, `weight`, `age`被声明为私有(`private`),意味着它们只能在类内部访问,而`love`被声明为静态...

    java学习 jdk1.7中文版本 java1.7api

    3. **钻石操作符**:在创建泛型集合对象时,Java 7引入了钻石操作符(),可以自动推断出泛型参数类型,使得代码更简洁。 ```java List&lt;String&gt; list = new ArrayList(); ``` 4. **文件系统API增强**:NIO.2提供了...

    java语言程序设计一书的demo实例

    学习如何定义和调用方法是理解Java程序结构的关键。示例中可能包含各种类型的函数,例如计算函数、数据处理函数等。 4. **数组与集合**:数组是存储同类型数据的序列,而集合框架则提供了更灵活的数据存储方式,如...

    华为Java笔试题华为Java笔试题

    - **解析**: `&&`是逻辑“与”操作符,`&lt;&gt;`在Java中并不存在,`if`是一个控制结构而非操作符,`:=`同样不存在于Java中。因此,正确答案是C和D。 ### 循环语句与变量的使用 **题目6**: 执行以下代码后,变量`c`的值...

    2021Java零基础自学笔记资源(十)Java中的方法

    方法的调用是通过类名或对象实例加上点操作符和方法名,然后传递实参。如果方法是静态的,可以直接通过类名调用,无需创建对象。实参和形参之间存在一对一的映射关系,即调用时的实参值会赋给方法内部的形参。 JVM...

    java期末试题及答案

    * 在Java中,抽象(abstract)方法是一种仅有方法头,没有具体方法体和操作实现的方法,该方法必须在抽象类之中定义。 * 在Java中,最终(final)方法是不能被当前类的子类重新定义的方法。 二、Java语法基础 * 在...

    JAVA jdk1.7 64位

    2. **类型推断**:通过使用钻石操作符(),Java 7简化了泛型实例化,减少了冗余的类型参数。 3. **文件系统API**:NIO.2(New I/O 2)提供了对文件系统更强大的操作,包括异步I/O操作,文件路径和链接,文件属性的...

    Java开发技术大全(500个源代码).

    invokeMethod.java 同一个类中调用方法示例 invokeOther.java 类的外部调用方法示例 invokeStaticMethod.java 调用静态方法示例 localVariable.java 演示局部变量 localVSmember.java 局部变量与成员变量同名...

Global site tag (gtag.js) - Google Analytics