浅谈getStackTrace()方法(一)
缘起:
今天看到有一个工具类中有一句:
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()方法(一)的更多相关文章
- 浅谈 虚方法(virtual)
虚方法 理解:从字面意思来讲,"虚",可有可无,子类对父类的某种方法的重写,可以重写,也可以不重写. 虚方法,顾名思义(装个13),就是某种方法. 用法:public virtua ...
- 浅谈getResource方法
项目经常会读取一些配置文件, 因此getResource方法便能够起到重要作用 使用时主要是两种方法, 一个是字节码文件Class类, 另一个是ClassLoader类加载器 使用Class类时有两种 ...
- Python之浅谈绑定方法
目录 绑定方法和非绑定方法 绑定方法 对象的绑定方法 类的绑定方法 非绑定方法 总结 绑定方法和非绑定方法 类中定义的方法大致可以分为两类:绑定方法和非绑定方法.其中绑定方法又可以分为绑定到对象的方法 ...
- 浅谈Android应用保护(一):Android应用逆向的基本方法
对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击.使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码.数据,修改其代码逻辑和机制等操作.这篇 ...
- JavaScript中toStirng()与Object.prototype.toString.call()方法浅谈
toStirng()与Object.prototype.toString.call()方法浅谈 一.toString()是一个怎样的方法?它是能将某一个值转化为字符串的方法.然而它是如何将一个值从一种 ...
- 浅谈配置chrome浏览器允许跨域操作的方法
浅谈配置chrome浏览器允许跨域操作的方法 一:(Lying人生感悟.可忽略) 最近有一天,对着镜子,发现满脸疲惫.脸色蜡黄.头发蓬松.眼神空洞,于是痛诉着说生活的不如意,工作没激情,工资不高,一个 ...
- 【转】浅谈Java中的hashcode方法(这个demo可以多看看)
浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...
- 浅谈局域网ARP攻击的危害及防范方法(图)
浅谈局域网ARP攻击的危害及防范方法(图) 作者:冰盾防火墙 网站:www.bingdun.com 日期:2015-03-03 自 去年5月份开始出现的校内局域网频繁掉线等问题,对正常的教育教 ...
- [原创]浅谈NT下Ring3无驱进入Ring0的方法
原文链接:浅谈NT下Ring3无驱进入Ring0的方法 (测试环境:Windows 2000 SP4,Windows XP SP2.Windows 2003 未测试) 在NT下无驱进入Ring0是一个 ...
随机推荐
- 2018.2.27 JavaScript数组方法应用
JavaScript数组方法应用 1.找出元素item在给定数组arr中的位置 function indexOf(arr,item){ return arr.indexOf(item); } func ...
- python3从尾到头打印链表
题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 方法一:通过栈实现 # -*- coding:utf-8 -*- # class ListNode: # def __ini ...
- Python 生成器和协程
Python3 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访 ...
- 吐槽在cocos2dx游戏接入腾讯信鸽的坑
腾讯信鸽是用来在后台推送消息给移动应用客户端使用,接入方法很简单,在信鸽官网注册个账号 http://xg.qq.com/xg,然后注册一个应用,在后台页面获得ACCESS ID, ACCESS KE ...
- NSString 使用 copy、strong
// 首先定义2个属性 @property (nonatomic, strong) NSString *stStr; @property (nonatomic, copy) NSString *coS ...
- OC中的宏定义
我们都知道,宏定义是编译期常量.而OC是一种动态语言. 1.iOS系统版本判断的两个宏定义 __IPHONE_OS_VERSION_MAX_ALLOWED // iOS系统版本最大允许 __IPHON ...
- [vijos]P1979 NOIP2015 信息传递
描述 有 n 个同学(编号为 1 到 n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 TiTi 的同学. 游戏开始时,每人都只知道 ...
- 二分查找、upper_bound、lower_bound
整理及总结二分查找的判断和边界细节 修改版 package com.leej.binarysearch; import java.util.Arrays; /** * @author jerry * ...
- python爬虫基础12-selenium大全6/8-等待
Selenium笔记(6)等待 本文集链接:https://www.jianshu.com/nb/25338984 简介 在selenium操作浏览器的过程中,每一次请求url,selenium都会等 ...
- python并发编程之进程1(守护进程,进程锁,进程队列)
进程的其他方法 P = Process(target=f,) P.Pid 查看进程号 查看进程的名字p.name P.is_alive() 返回一个true或者False P.terminate( ...