浅谈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是一个 ...
随机推荐
- npm模块安装机制简介
npm是node的模块管理器,功能及其强大,它是node获得成功的重要原因之一. 正因为有了nom,我们只要一行命令,就能安装别人写好的模块. $ npm install 本文介绍npm模块安装机制的 ...
- 天坑之mysql乱码问题以及mysql重启出现1067的错误解决
相信很多小伙伴都遇到过数据库中文乱码问题,很头疼,明明Navicat上的编码格式都是utf-8是一样的啊? 为什么还是乱码? 原因是Navicat上的数据库编码格式并不是真正的编码格式 ,所以明白了吗 ...
- Bootstrap 页面标题(Page Header)
Bootstrap页面标题(PageHeader)是个不错功能,它会网页的标题的四周添加适当的间距,当一个网页中有多个标题并且每个标题之间需要添加一定适当的间距,使用页面标题是非常有用的.如果需要使用 ...
- c++ 创建路径方法
linux.unix平台 #include "stdio.h" #include "stdlib.h" #include <sys/types.h> ...
- I/O理解
I/O是什么 我的理解I/O就是用于读写的一个流 官方解释:I/O(英语:Input/Output),即输入/输出,通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出. node中的io ...
- 【模板】无旋Treap(FHQ)
如题,这是一个模板... #include <algorithm> #include <iostream> #include <cstring> #include ...
- jenkins+svn+pipeline+kubernetes部署java应用(二)
在jenkins中只能通过http的方式获取svn的数据,所以需要配置svn的http访问方式 一.安装http服务端和mod_dav_svn插件 由于Subversion需要版本化的控制,因此标准的 ...
- Linux redis服务搭建记录
Redis的安装 1.安装redis需要C语言的编译环境 //gcc在线安装 yum install gcc-c++ 如果提示 /var/run/yum.pid 已被锁定,解决办法,删除yum.pid ...
- python入门:输出1-10以内除去7的所有数(简)
#!/usr/bin/env python # -*- coding:utf-8 -*- #输出1-10以内除去7的所有数(简) """ 给变量kaishi赋值1,whi ...
- jQuery将物体居中,并且转换显示和隐藏
今天来给大家贴一段代码,代码的作用就是利用jQuery将物体居中,并且转换显示和隐藏: 首先建立一个div标签并且写好css样式,具体如下 然后我想要的效果是当我点击了button这个按钮,test可 ...