2012-12-08 148 views
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); 
    } 

} 

这将需要在进入主时(打印出栈),在进入从主()递归(102)时,当其进入递归( 102/10),它是递归(10),当它从递归(10)进入递归(10/10)时递归(102)。当它到达基线递归(1)时,打印出一条消息,然后打印掉函数递归(10),递归(102)和main()的反向重访堆栈。最后打印出我们正在退出main()。

+1

这将是更适合的SO。遵循的一条好规则是如果你的问题在IDE前面,它就属于SO。如果您问题是否在白板前,则属于程序员。请不要在那里重申这个问题,因为它可以为你迁移。 – Walter

+0

@Walter你可以动它吗? –

回答

2

Thread类允许管理操作系统的线程,它不会有什么做的调用堆栈。 StackTraceElement代表一个堆栈帧,但您需要使用StackTrace才能达到它。

您正在寻找堆栈跟踪更改时间的通知,例如添加了框架(输入方法)或删除(方法退出)。

到目前为止,此任务的最合适的工具是AspectJ。它允许你定义advices(一种方法),当其他方法被输入或存在时被调用(除了其他情况)。这些导致建议被调用的触发器被称为pointcuts - 它们可以是方法输入,退出,并且可以使用通配符来描述方法:切入点MyClass.get*适用于MyClass的所有获取方法。

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; 
} 
}