欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

StackTraceElement獲取方法調(diào)用棧信息實(shí)例詳解

 更新時(shí)間:2018年02月02日 09:35:31   作者:Mirhunana  
這篇文章主要介紹了StackTraceElement獲取方法調(diào)用棧信息實(shí)例詳解,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下

本文研究的主要是StackTraceElement獲取方法調(diào)用棧信息的相關(guān)內(nèi)容,具體介紹和實(shí)例如下。

一、什么是StackTrace

StackTrace(堆棧軌跡)存放的就是方法調(diào)用棧的信息,異常處理中常用的printStackTrace()實(shí)質(zhì)就是打印異常調(diào)用的堆棧信息。

二、StackTraceElement介紹

StackTraceElement表示StackTrace(堆棧軌跡)中的一個(gè)方法對(duì)象,屬性包括方法的類(lèi)名、方法名、文件名以及調(diào)用的行數(shù)。

public final class StackTraceElement implements java.io.Serializable {
	// Normally initialized by VM (public constructor added in 1.5) 
	private String declaringClass;
	private String methodName;
	private String fileName;
	private int  lineNumber;
}

StackTraceElement被定義為final,可見(jiàn)其作為一個(gè)java的基礎(chǔ)類(lèi)不允許被繼承。

獲取StackTraceElement的方法有兩種,均返回StackTraceElement數(shù)組,也就是這個(gè)棧的信息。

1、Thread.currentThread().getStackTrace()

2、new Throwable().getStackTrace()

StackTraceElement數(shù)組包含了StackTrace(堆棧軌跡)的內(nèi)容,通過(guò)遍歷它可以得到方法間的調(diào)用過(guò)程,即可以得到當(dāng)前方法以及其調(diào)用者的方法名、調(diào)用行數(shù)等信息

public class TestClass {
	public static void main(String[] args) 
	  {
		new TestClass().methodA();
	}
	private void methodA(){
		System.out.println("------進(jìn)入methodA----------");
		methodB();
	}
	private void methodB(){
		System.out.println("------進(jìn)入methodB----------");
		StackTraceElement elements[] = Thread.currentThread().getStackTrace();
		for (int i = 0; i < elements.length; i++) {
			StackTraceElement stackTraceElement=elements[i];
			String className=stackTraceElement.getClassName();
			String methodName=stackTraceElement.getMethodName();
			String fileName=stackTraceElement.getFileName();
			int lineNumber=stackTraceElement.getLineNumber();
			System.out.println("StackTraceElement數(shù)組下標(biāo) i="+i+",fileName="
			          +fileName+",className="+className+",methodName="+methodName+",lineNumber="+lineNumber);
		}
	}
}

三、用途

1、我們可以封裝一個(gè)日志庫(kù),在打印目標(biāo)日志的時(shí)候,也可以通過(guò)這個(gè)調(diào)用棧打印出這個(gè)日志所在的行數(shù),這樣就可以迅速的定位到日志輸出行,再也不要全局搜索去查找了。

public static void d(String tag, String msg, Object... params) {
  StackTraceElement targetStackTraceElement = getTargetStackTraceElement();
  Log.d(tag, "(" + targetStackTraceElement.getFileName() + ":"
      + targetStackTraceElement.getLineNumber() + ")");
  Log.d(tag, String.format(msg, params));
}

2、如果我們寫(xiě)了一個(gè)SDK,希望某個(gè)方法在固定的位置被調(diào)用,我們也可以在這個(gè)方法被調(diào)用的時(shí)候,進(jìn)行檢查,看這個(gè)方法的調(diào)用位置是否正確。

例如,必須在Activity.onResume中執(zhí)行,PVSdk.onResume,所以我們?cè)谡{(diào)用PVSdk.onResume方法的時(shí)候,在PVSdk.onResume方法里面來(lái)通過(guò)獲取調(diào)用棧的信息檢測(cè)這個(gè)方法是否在Activity的onResume方法中調(diào)用的。

public class PVSdk {
	public static void onResume() {
		StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
		Boolean result = false;
		for (StackTraceElement stackTraceElement : stackTrace) {
			String methodName = stackTraceElement.getMethodName();
			String className = stackTraceElement.getClassName();
			try {
				Boolean assignableFromClass = Class.forName(className).isAssignableFrom(Activity.class);
				if (assignableFromClass && "onResume".equals(methodName)) {
					result = true;
					break;
				}
			}
			catch (ClassNotFoundException e) {
			}
		}
		if (!result)
		      throw new RuntimeException("PVSdk.onResume must in Activity.onResume");
	}
}

3、我們?cè)谶M(jìn)行源碼分析的時(shí)候,如果想分析整個(gè)代碼的執(zhí)行流程,我們可以進(jìn)行通過(guò)打印棧的信息來(lái)獲取,這個(gè)在源碼分析的時(shí)候還是挺有用的。

總結(jié)

以上就是本文關(guān)于StackTraceElement獲取方法調(diào)用棧信息實(shí)例詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專(zhuān)題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • mybatis返回map結(jié)果集@MapKey使用的場(chǎng)景分析

    mybatis返回map結(jié)果集@MapKey使用的場(chǎng)景分析

    這篇文章主要介紹了mybatis返回map結(jié)果集@MapKey使用的場(chǎng)景分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 看過(guò)就懂的java零拷貝及實(shí)現(xiàn)方式詳解

    看過(guò)就懂的java零拷貝及實(shí)現(xiàn)方式詳解

    這篇文章主要為大家詳細(xì)的介紹了什么是零拷貝,傳統(tǒng)的IO執(zhí)行流程,零拷貝相關(guān)的知識(shí)點(diǎn)回顧,零拷貝實(shí)現(xiàn)的幾種方式及java提供的零拷貝方式相關(guān)內(nèi)容,有需要的朋友可以借鑒參考下
    2022-01-01
  • Java 將List中的實(shí)體類(lèi)按照某個(gè)字段進(jìn)行分組并存放至Map中操作

    Java 將List中的實(shí)體類(lèi)按照某個(gè)字段進(jìn)行分組并存放至Map中操作

    這篇文章主要介紹了Java 將List中的實(shí)體類(lèi)按照某個(gè)字段進(jìn)行分組并存放至Map中操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • 淺談從Java中的棧和堆,進(jìn)而衍生到值傳遞

    淺談從Java中的棧和堆,進(jìn)而衍生到值傳遞

    這篇文章主要介紹了淺談從Java中的棧和堆,進(jìn)而衍生到值傳遞,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • idea的運(yùn)行按鈕是灰色問(wèn)題及解決

    idea的運(yùn)行按鈕是灰色問(wèn)題及解決

    這篇文章主要介紹了idea的運(yùn)行按鈕是灰色問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java+opencv3.2.0實(shí)現(xiàn)重映射

    Java+opencv3.2.0實(shí)現(xiàn)重映射

    這篇文章主要為大家詳細(xì)介紹了Java+opencv3.2.0實(shí)現(xiàn)重映射的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 詳解JAVA Timer和TimerTask

    詳解JAVA Timer和TimerTask

    這篇文章主要介紹了JAVA Timer和TimerTask的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • SpringMVC 數(shù)據(jù)校驗(yàn)實(shí)例解析

    SpringMVC 數(shù)據(jù)校驗(yàn)實(shí)例解析

    這篇文章主要介紹了SpringMVC 數(shù)據(jù)校驗(yàn)實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java如何實(shí)現(xiàn)將類(lèi)文件打包為jar包

    Java如何實(shí)現(xiàn)將類(lèi)文件打包為jar包

    這篇文章主要介紹了Java如何實(shí)現(xiàn)將類(lèi)文件打包為jar包,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java跨session實(shí)現(xiàn)token接口測(cè)試過(guò)程圖解

    Java跨session實(shí)現(xiàn)token接口測(cè)試過(guò)程圖解

    這篇文章主要介紹了Java跨session實(shí)現(xiàn)token接口測(cè)試過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評(píng)論