StockTraceElement取得方法スタック情報の実例を呼び出します。

3792 ワード

本研究の主な内容はStockTraceElementの取得方法であり、スタックの情報を呼び出すための関連内容であり、具体的な紹介と実例は以下の通りである。
一、何がStockTraceですか?
StockTrace(スタック軌跡)は、スタックの情報を呼び出す方法です。異常処理でよく使われるprint StockTraceは、実質的に異常呼び出しのスタック情報を印刷します。
二、StockTraceElementの紹介
StockTraceElementは、StockTraceの方法オブジェクトを表し、属性は、方法のクラス名、方法名、ファイル名、および呼び出しの行数を含む。

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;
}
StockTraceElementはfinalと定義されていますが、Javaの基礎クラスとしては引き継がれないことが分かります。
StockTraceElementを取得する方法は二つあります。StockTraceElement配列、つまりこのスタックの情報を返します。
1、Thread.current Thread().get StockTrace()
2、new Throwable().get StockTrace()
StockTraceElement配列は、StockTraceの内容を含み、これを巡回することによって、方法間の呼び出しプロセスを得ることができます。すなわち、現在の方法およびその使用者の方法名、呼び出しライン数などの情報を得ることができます。

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     i="+i+",fileName="
			          +fileName+",className="+className+",methodName="+methodName+",lineNumber="+lineNumber);
		}
	}
}
三、用途
1、私達はログライブラリをカプセル化してもいいです。ターゲットログを印刷する時に、この呼び出しスタックを通じてこのログがある行数をプリントアウトしてもいいです。これでログ出力行に迅速に位置決めできます。もうグローバル検索をしないでください。

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と書いたら、ある方法が固定の位置で呼び出されたいです。この方法が呼び出された時に、この方法の呼び出し位置が正しいかどうかを確認してもいいです。
例えば、Activity.onResumeで実行しなければなりません。PVS dk.onResumeですので、PVsdk.onResumeメソッドを呼び出したとき、PVsdk.onResumeメソッドでは、呼び出しスタックの情報を取得して、この方法がActivityのonResumeメソッドで呼び出されたかどうかを検出します。

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、ソース分析を行う時、コード全体の実行プロセスを分析したいなら、私達はスタックの情報を印刷して取得することができます。これはソース分析の時に役に立ちます。
締め括りをつける
以上がStockTraceElementの取得方法についてスタックの情報インスタンスを呼び出して詳細に説明した内容のすべてです。興味のある方は引き続き当駅の他のテーマを参照してください。友達のサポートに感謝します。