1

再帰を使用するクラスが拡張できる親Javaクラスを作成する必要があります。親クラスは、呼び出しスタックが変更されるたびに(メソッドを入力するか、一時的に別のメソッド呼び出しに移動するためにそのままにしておくか、メソッドを終了する)、それを出力することができます。コンソールに印刷したいのですが、毎回コンソールもクリアしてスタックを水平に表示し、各スタックの高さを確認して、何が飛び出したか、何が飛び出したかを確認できるようにします...ベースラインの場合も印刷します再帰関数で到達しました。

初め。StackTraceElementsクラスとThreadクラスを使用して、手動で呼び出すことなく、スタックが要素をポップまたはプッシュしたときに自動的に検出するにはどうすればよいですか?

第二に、私はどのように清算を行うのでしょうか?

たとえば、私がコードを持っていた場合:

public class recursion(int i)
{ 
    private static void recursion(int i)
    {
        if(i < 10)
            System.out.println('A');
        else
        {
            recursion(i / 10 );
            System.out.println('B');
        }
    } 
    public static void main(String[] argv)
    {
        recursion(102);
    }

}

main()に入るとき、main()からrecursion(102)に入るとき、recursion(102)からrecursion(102/10)に入るとき、recursion(102)に入るとき、スタックを出力する必要があります。 recursion(10)からrecursion(1)であるrecursion(10/10)に入ります。メッセージがベースラインrecursion(1)に達したときにメッセージを出力します。次に、関数recursion(10)、recursion(102)、およびmain()の逆再訪問のスタックを出力します。最後に、main()を終了することを出力します。

4

2 に答える 2

2

ThreadクラスはOSスレッドの管理を可能にし、コールスタックとは何の関係もありません。StackTraceElementスタックフレームを表しますが、それに到達するにはが必要ですStackTrace

フレームが追加された(メソッドが入力された)または削除された(メソッドが終了した)など、スタックトレースが変更されたときの通知を探しています。

このタスクに最適なツールはですAspectJadvices他のメソッドが入力または存在したときに(他の場合を除いて)呼び出される(一種のメソッド)を定義できます。アドバイスが呼び出される結果となるこれらのトリガーは呼び出されます。これらのトリガーはpointcutsメソッドのエントリ、終了であり、ワイルドカードを使用してメソッドを記述できます。ポイントカットMyClass.get*はMyClassのすべてのgetメソッドに適用されます。

于 2012-12-08T20:45:57.843 に答える
0

私はあなたの答えを見る前に自分で書き始めました。フォームは単純ですが、シェルは次のとおりです。

パッケージstackTraceLogger;

import java.util.ArrayList;

public class StackTraceLogger 
{

static final int MAX_ROW = Integer.MAX_VALUE;
static final int MAX_COLUMN = Integer.MAX_VALUE;

static public ArrayList<ArrayList<String>> stringTrace;
//private ArrayList<ArrayList<StackTraceElement>> stack;


public StackTraceLogger()
{
     stringTrace = new ArrayList< ArrayList <String>>();
    //stack = new ArrayList<ArrayList<StackTraceElement>>();
}

static public void addStack(StackTraceElement[] inputTrace) 
{
        int size = inputTrace.length;
        // make an ArrayList with the strings of all the StrackTraceElements
        ArrayList<String> str = new  ArrayList<>(size);

        for(int i = 0; i < size; i++)
        {
            str.add(i,inputTrace[i].getMethodName());
        }   

        // Add the ArrayList to the 2D ArrayList of the stacks

}
static public void printTrace()
{

/*  if(stringTrace.get(0).size() > 0)
    {
        for(int i = 0; i < stringTrace.size(); i++)
        {
            System.out.println(stringTrace.get(i));
            for(int j = 0; j < stringTrace.get(j).size(); j++)
                System.out.println(stringTrace.get(i).get(j));
        }
    }*/
}

static private ArrayList<String> convertToArrayList(StackTraceElement[] inputTrace) 
{
    ArrayList<String> strTrace = new ArrayList<>();
    for(int j = 0; j < inputTrace.length; j++ )
        strTrace.add(inputTrace[j].getMethodName());
    return strTrace;
}
}
于 2012-12-12T20:10:58.940 に答える