最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

一、什么是StackTrace

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

二、StackTraceElement介紹

StackTraceElement表示StackTrace(堆棧軌跡)中的一個方法對象,屬性包括方法的類名、方法名、文件名以及調(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,可見其作為一個java的基礎(chǔ)類不允許被繼承。

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

1、Thread.currentThread().getStackTrace()

2、new Throwable().getStackTrace()

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

public class TestClass {
	public static void main(String[] args) 
	  {
		new TestClass().methodA();
	}
	private void methodA(){
		System.out.println("------進入methodA----------");
		methodB();
	}
	private void methodB(){
		System.out.println("------進入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ù)組下標 i="+i+",fileName="
			          +fileName+",className="+className+",methodName="+methodName+",lineNumber="+lineNumber);
		}
	}
}

三、用途

1、我們可以封裝一個日志庫,在打印目標日志的時候,也可以通過這個調(diào)用棧打印出這個日志所在的行數(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、如果我們寫了一個SDK,希望某個方法在固定的位置被調(diào)用,我們也可以在這個方法被調(diào)用的時候,進行檢查,看這個方法的調(diào)用位置是否正確。

例如,必須在Activity.onResume中執(zhí)行,PVSdk.onResume,所以我們在調(diào)用PVSdk.onResume方法的時候,在PVSdk.onResume方法里面來通過獲取調(diào)用棧的信息檢測這個方法是否在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、我們在進行源碼分析的時候,如果想分析整個代碼的執(zhí)行流程,我們可以進行通過打印棧的信息來獲取,這個在源碼分析的時候還是挺有用的。

總結(jié)

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

相關(guān)文章

  • Java實現(xiàn)冒泡排序算法及對其的簡單優(yōu)化示例

    Java實現(xiàn)冒泡排序算法及對其的簡單優(yōu)化示例

    這篇文章主要介紹了Java實現(xiàn)冒泡排序算法及對其的簡單優(yōu)化示例,冒泡排序的最差時間復雜度為O(n^2),最優(yōu)時間復雜度為O(n),存在優(yōu)化的余地,需要的朋友可以參考下
    2016-05-05
  • Java try-catch-finally異常處理機制詳解

    Java try-catch-finally異常處理機制詳解

    這篇文章主要介紹了Java try-catch-finally異常處理機制詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 最安全的加密算法Bcrypt防止數(shù)據(jù)泄露詳解

    最安全的加密算法Bcrypt防止數(shù)據(jù)泄露詳解

    這篇文章主要為大家介紹了最安全的加密算法Bcrypt防止數(shù)據(jù)泄露詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Java多線程之synchronized關(guān)鍵字的使用

    Java多線程之synchronized關(guān)鍵字的使用

    這篇文章主要介紹了Java多線程之synchronized關(guān)鍵字的使用,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java多線程之條件對象Condition

    Java多線程之條件對象Condition

    這篇文章主要介紹了Java多線程之條件對象Condition,Condition中的await()方法相當于Object的wait()方法,Condition中的signal()方法相當于Object的notify()方法,Condition中的signalAll()相當于Object的notifyAll()方法,接下來和小編一起進入文章了解更具體的內(nèi)容
    2021-10-10
  • Java%(取模運算)全面講解

    Java%(取模運算)全面講解

    這篇文章主要介紹了Java%(取模運算)全面講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 基于XML的Spring聲明事務控制

    基于XML的Spring聲明事務控制

    這篇文章主要為大家詳細介紹了基于XML的Spring聲明事務控制,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 基于java實現(xiàn)websocket代碼示例

    基于java實現(xiàn)websocket代碼示例

    這篇文章主要介紹了基于java實現(xiàn)websocket代碼示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • MyBatis-Plus 分頁插件配置的兩種方式實現(xiàn)

    MyBatis-Plus 分頁插件配置的兩種方式實現(xiàn)

    本文主要介紹了MyBatis-Plus 分頁插件配置的兩種方式實現(xiàn),包括使用PaginationInterceptor和MybatisPlusInterceptor兩種方式,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • MyBatis實現(xiàn)動態(tài)SQL的實現(xiàn)方法

    MyBatis實現(xiàn)動態(tài)SQL的實現(xiàn)方法

    這篇文章主要介紹了MyBatis實現(xiàn)動態(tài)SQL的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12

最新評論

凤山市| 于都县| 舞钢市| 阿坝县| 凌云县| 北京市| 布拖县| 河曲县| 栾城县| 白银市| 商丘市| 武威市| 乡宁县| 彝良县| 铁岭市| 奉节县| 区。| 汉寿县| 高雄市| 博客| 河南省| 天全县| 尼木县| 余庆县| 临洮县| 库尔勒市| 莱州市| 清镇市| 龙门县| 宜昌市| 农安县| 东乡族自治县| 林州市| 和林格尔县| 洛扎县| 石阡县| 北宁市| 剑河县| 栾城县| 来安县| 太保市|