浅谈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

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

时间: 2024-08-19 12:06:36

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

浅谈_call()方法

直接看代码: 1 <? 2 3 abstract class peoplea{ 4 var $lei="抽象类的幸福"; 5 abstract function speak(); 6 } 7 class man extends peoplea{ 8 function speak(){ 9 echo "抽象类的重载"; 10 } 11 public function __call($method,$parameter){ 12 echo '方法不存在,方法名为:

C#之浅谈虚方法和抽象方法的区别

抽象类:有时我们表达一些抽象的东西,它是一种概括,不需要它成为一种实体,所以面向对象便有了抽象类.具体来讲:一个员工,它属于一个公司,但是公司只是一个名称,我们不需要它成为一个实体,所以公司就是一个抽象类.何时必须声明一个类为抽象类?(面试题)当这个类中包含抽象方法时,或是该类并没有完全实现父类的抽象方法时.抽象类的特点:抽象类使用abstract修饰符,并且它只能是用作基类.抽象类不能实例化,当使用new运算符对其实例时会出现编译错误.允许(但不要求)抽象类包含抽象成员.(非抽象类不能包括抽象

浅谈 js 正则之 test 方法

原文:浅谈 js 正则之 test 方法 其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西.先来看个东西吧. ? 1 2 3 4 5 var re = /\d/; console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1"

【转载】浅谈深度学习(Deep Learning)的基本思想和方法

浅谈深度学习(Deep Learning)的基本思想和方法 分类: 机器学习 信息抽取 Deep Learning2013-01-07 22:18 25010人阅读 评论(11) 收藏 举报 深度学习(Deep Learning),又叫Unsupervised Feature Learning或者Feature Learning,是目前非常热的一个研究主题. 本文将主要介绍Deep Learning的基本思想和常用的方法. 一. 什么是Deep Learning? 实际生活中,人们为了解决一个问

浅谈C# 多态的魅力(虚方法,抽象,接口实现)

浅谈C# 多态的魅力(虚方法,抽象,接口实现) 分类:             asp.net             C#              2014-02-08 11:29     786人阅读     评论(0)     收藏     举报 浅谈C# 多态的魅力(虚方法,抽象,接口实现) 前言:我们都知道面向对象的三大特性:封装,继承,多态.封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向

浅谈小网站SEO的几点建设方法

现在很多小企业也开始建站,那该怎样做好小企业的seo呢? 1.通过seo树立品牌 对于小企业来说,当然不能做到像大型企业一样品牌人人皆知.但是与其他同等小企业.竞争对手相比,如果能够在搜索引擎结果中表现良好,就可以树立 良好的形象.所谓"排名第一就是品牌",在搜索引擎中排名第一就能让客户感觉到企业是一个充满活力.办事认真.积极上进的组织,客户第一面就打上了良 好的印象分.排名第一带来的客户在互联网真是数不甚数.那么如何通过seo树立品牌呢?第一,要使自己的企业名.地区行业关键字排名第一

浅谈 js 字符串 trim 方法之正则篇

position:static(静态定位) 当position属性定义为static时,可以将元素定义为静态位置,所谓静态位置就是各个元素在HTML文档流中应有的位置 podisition定位问题.所以当没有定义position属性时,并不说明该元素没有自己的位置,它会遵循默认显示为静态位置,在静态定位状态下无法通过坐标值(top,left,right,bottom)来改变它的位置. position:absolute(绝对定位) 当position属性定义为absolute时,元素会脱离文档流

浅谈设计模式3-模板方法模式

模版方法模式,个人认为还是用处比较多的一个设计模式,而且也是比较好学和理解的一个.依然来通过模拟一个场景来慢慢了解. 现在我们来实现一下泡茶这个过程.首先我们需要烧开一壶水,然后往茶壶中放茶叶,加入开水,等待茶泡好. 经过前两次的分享,大家应该具备了基本的面向对象的思想了,这里就不再用面向过程的方式演示了. 首先,有一种普通人,他泡茶的方式是这样的 public class Common     { public void MakeTea()         {             Heat

浅谈 JSON.stringify 方法

用过 json 的应该都知道,把一个对象通过 stringify 之后提交给后台或者存储在 Storage 里是很常用的手段.但是 IE6-7 下没有 JSON 对象,所以要借助 json2.js 来实现. 今天我们来简单介绍下 stringify 方法的一些正确使用姿势吧.当然,让高手们贱笑了,本文只是分享一些方法给新手朋友们. var data = [ {name: "王尼玛", sex:1, age: 30}, {name: "王尼美", sex:0, age