缘起:

  今天看到有一个工具类中有一句:

	String msgToPrint = Thread.currentThread().getStackTrace()[1].getMethodName();

输出的结果很简单,就是调用类的方法名。

文档: 

public StackTraceElement[] getStackTrace()
返回一个表示该线程堆栈转储的堆栈跟踪元素数组。如果该线程尚未启动或已经终止,则该方法将返回一个零长度数组。如果返回的数组不是零长度的,则其第一个元素代表堆栈顶,它是该序列中最新的方法调用。最后一个元素代表堆栈底,是该序列中最旧的方法调用。

如果有安全管理器,并且该线程不是当前线程,则通过 RuntimePermission("getStackTrace") 权限调用安全管理器的 checkPermission 方法,查看是否可以获取堆栈跟踪。

某些虚拟机在某些情况下可能会从堆栈跟踪中省略一个或多个堆栈帧。在极端情况下,没有该线程堆栈跟踪信息的虚拟机可以从该方法返回一个零长度数组。

返回:
StackTraceElement 数组,每个数组代表一个堆栈帧。

其中使用的Thread类的第一个方法:

	public static Thread currentThread()

第二个方法:(阅读Java SE的文档:)

	public StackTraceElement[] getStackTrace()

返回一个堆栈轨迹元素的数组,代表了这个线程的堆栈情况。

如果:1.这个线程没有被开启;2.这个线程被开启了但是没有被系统运行过(因为线程运行是需要根据一定规律轮换的);3.这个线程结束了。

这三种情况下getStackTrace()返回的数组长度为0。

如果返回的数组长度不为0,那么数组的第一个元素代表栈顶元素,即是这个调用序列中最recent的方法。

数组的最后一个元素代表栈底元素,即调用序列中最远的一个元素。

程序实测——Java程序

测试类,main方法如下:

	public static void main(String[] args) {
StackTraceElement[] stackTraceElements=Thread.currentThread().getStackTrace();
System.out.println("The stackTraceElements length:"+stackTraceElements.length);
for(int i=0;i<stackTraceElements.length;i++){
System.out.println("\n---the "+i+" element"+"---");
System.out.println("toString:"+stackTraceElements[i].toString());
System.out.println("ClassName:"+stackTraceElements[i].getClassName());
System.out.println("FileName:"+stackTraceElements[i].getFileName());
System.out.println("LineNumber:"+stackTraceElements[i].getLineNumber());
System.out.println("MethodName:"+stackTraceElements[i].getMethodName());
}
}

执行后输出:

The stackTraceElements length:2

---the  0  element---
toString:java.lang.Thread.getStackTrace(Thread.java:1567)
ClassName:java.lang.Thread
FileName:Thread.java
LineNumber:1567
MethodName:getStackTrace ---the 1 element---
toString:Exchange.main(Exchange.java:10)
ClassName:Exchange
FileName:Exchange.java
LineNumber:10
MethodName:main

如果再用一个私有方法,输出调用堆栈的信息

	public static void main(String[] args) {
StackTraceElement[] stackTraceElements=Thread.currentThread().getStackTrace();
System.out.println("The stackTraceElements length:"+stackTraceElements.length);
for(int i=0;i<stackTraceElements.length;i++){
System.out.println("\n---the "+i+" element"+"---");
System.out.println("toString:"+stackTraceElements[i].toString());
System.out.println("ClassName:"+stackTraceElements[i].getClassName());
System.out.println("FileName:"+stackTraceElements[i].getFileName());
System.out.println("LineNumber:"+stackTraceElements[i].getLineNumber());
System.out.println("MethodName:"+stackTraceElements[i].getMethodName());
}
printStackInfos();
}
private static void printStackInfos(){
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
System.out.println("\nCalled in printStackInfos() method!!!");
System.out.println("The stackTraceElements length:"+stackTraceElements.length);
for(int i =0;i<stackTraceElements.length;i++){
System.out.println("\n---the "+i+" element"+"---");
System.out.println("toString:"+stackTraceElements[i].toString());
System.out.println("ClassName:"+stackTraceElements[i].getClassName());
System.out.println("FileName:"+stackTraceElements[i].getFileName());
System.out.println("LineNumber:"+stackTraceElements[i].getLineNumber());
System.out.println("MethodName:"+stackTraceElements[i].getMethodName());
} }

则输出结果如下:

The stackTraceElements length:2

---the  0  element---
toString:java.lang.Thread.getStackTrace(Thread.java:1567)
ClassName:java.lang.Thread
FileName:Thread.java
LineNumber:1567
MethodName:getStackTrace ---the 1 element---
toString:Exchange.main(Exchange.java:10)
ClassName:Exchange
FileName:Exchange.java
LineNumber:10
MethodName:main Called in printStackInfos() method!!!
The stackTraceElements length:3 ---the 0 element---
toString:java.lang.Thread.getStackTrace(Thread.java:1567)
ClassName:java.lang.Thread
FileName:Thread.java
LineNumber:1567
MethodName:getStackTrace ---the 1 element---
toString:Exchange.printStackInfos(Exchange.java:24)
ClassName:Exchange
FileName:Exchange.java
LineNumber:24
MethodName:printStackInfos ---the 2 element---
toString:Exchange.main(Exchange.java:20)
ClassName:Exchange
FileName:Exchange.java
LineNumber:20
MethodName:main

可以看到加了一个私有方法之后,返回的堆栈元素就多了一个,并且它的位置在调用它的方法和被它调用的方法之间

浅谈getStackTrace()方法(一)的更多相关文章

  1. 浅谈 虚方法(virtual)

    虚方法 理解:从字面意思来讲,"虚",可有可无,子类对父类的某种方法的重写,可以重写,也可以不重写. 虚方法,顾名思义(装个13),就是某种方法. 用法:public virtua ...

  2. 浅谈getResource方法

    项目经常会读取一些配置文件, 因此getResource方法便能够起到重要作用 使用时主要是两种方法, 一个是字节码文件Class类, 另一个是ClassLoader类加载器 使用Class类时有两种 ...

  3. Python之浅谈绑定方法

    目录 绑定方法和非绑定方法 绑定方法 对象的绑定方法 类的绑定方法 非绑定方法 总结 绑定方法和非绑定方法 类中定义的方法大致可以分为两类:绑定方法和非绑定方法.其中绑定方法又可以分为绑定到对象的方法 ...

  4. 浅谈Android应用保护(一):Android应用逆向的基本方法

    对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击.使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码.数据,修改其代码逻辑和机制等操作.这篇 ...

  5. JavaScript中toStirng()与Object.prototype.toString.call()方法浅谈

    toStirng()与Object.prototype.toString.call()方法浅谈 一.toString()是一个怎样的方法?它是能将某一个值转化为字符串的方法.然而它是如何将一个值从一种 ...

  6. 浅谈配置chrome浏览器允许跨域操作的方法

    浅谈配置chrome浏览器允许跨域操作的方法 一:(Lying人生感悟.可忽略) 最近有一天,对着镜子,发现满脸疲惫.脸色蜡黄.头发蓬松.眼神空洞,于是痛诉着说生活的不如意,工作没激情,工资不高,一个 ...

  7. 【转】浅谈Java中的hashcode方法(这个demo可以多看看)

    浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...

  8. 浅谈局域网ARP攻击的危害及防范方法(图)

    浅谈局域网ARP攻击的危害及防范方法(图)   作者:冰盾防火墙 网站:www.bingdun.com 日期:2015-03-03   自 去年5月份开始出现的校内局域网频繁掉线等问题,对正常的教育教 ...

  9. [原创]浅谈NT下Ring3无驱进入Ring0的方法

    原文链接:浅谈NT下Ring3无驱进入Ring0的方法 (测试环境:Windows 2000 SP4,Windows XP SP2.Windows 2003 未测试) 在NT下无驱进入Ring0是一个 ...

随机推荐

  1. Windows 漏洞利用开发

    第一阶段:简单栈溢出 分析栈溢出原理 寻找溢出点,了解pattern_create和pattern_offset计算溢出点的原理 寻找JMP ESP跳板,分析利用JMP ESP跳板劫持程序流的原理 编 ...

  2. 小技巧:unicode RLO

    unicode 控制字符 RLO 可以将位于其后的文字翻转. 于是可以被病毒利用. 如图 重命名文件,在gpj前插入unicode RLO,之后若不小心,可能会被欺骗,误以为是jpg文件. 如果修改程 ...

  3. “CTL_CODE”未定义

    C4013 “CTL_CODE”未定义:假设外部返回 int 要加入 #include<winioctl.h> 并且要放在#include<windows.h>的后面

  4. iview Tooltip换行及应用

    第一种: <Tooltip placement="bottom"> <Button>Multiple lines</Button> <di ...

  5. 状态压缩dp 状压dp 详解

    说到状压dp,一般和二进制少不了关系(还常和博弈论结合起来考,这个坑我挖了还没填qwq),二进制是个好东西啊,所以二进制的各种运算是前置知识,不了解的话走下面链接进百度百科 https://baike ...

  6. 【差分约束】poj1275Cashier Employment

    比较经典的差分约束 Description A supermarket in Tehran is open 24 hours a day every day and needs a number of ...

  7. HTTP-常用配置

    前言 这篇主要介绍HTTP服务程序环境 可能有一些介绍不到,博主能力有限,欢迎大神来纠正改进 HTTP协议从http/0.9到如今的http/2.0中间发生了很大的改变,现在主流的事http/1.1 ...

  8. 08GNU as汇编

    1. 概述 ​ 由于操作系统许多关键代码要求有很高的执行速度和效率,因此在一个操作系统源代码中通常就会包含大约 10% 左右的起关键作用的汇编语言程序量.Linux 操作系统也不例外,它的 32 位初 ...

  9. cURL error 60: SSL certificate problem: unable to get local issuer certificate (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)

    参考  http://blog.csdn.net/mazicwong/article/details/54946952 1.到https://curl.haxx.se/ca/cacert.pem复制下 ...

  10. 这一千个Python库,总有你想要的!

    环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. v ...