2012-12-08 2 views
1

재귀를 사용하여 클래스를 확장 할 수있는 상위 Java 클래스를 작성해야합니다. 부모 클래스는 호출 스택이 변경 될 때마다 (메소드를 입력하거나, 일시적으로 다른 메소드 호출로 이동하거나, 메소드로 통합 된 경우) 실현 한 다음이를 인쇄 할 수 있습니다. 나는 콘솔에서 인쇄하기를 원하지만 매번 콘솔을 지우고 싶을 때마다 스택을 horizantaly로 보여주기 때문에 각 스택의 높이를보고 갑자기 튀어 나온 것을 볼 수있다. 또한 기준선 인 경우 인쇄한다. 재귀 함수에 도달했습니다.Stack Trace Logger

처음. 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)를 입력 할 때, 그것은 재귀 (입력 재귀 (10)는 재귀 (10)에서 재귀 (1) 인 재귀 (10/10)에 들어가면 재귀 (102)에서 발생합니다. 기본 재귀 (1)에 도달하면 메시지를 출력하고, 함수 재귀 (10), 재귀 (102) 및 main()의 역전 된 재검토 스택을 출력합니다. 마침내 main()을 종료합니다.

+1

이렇게하면 더 적합 할 것입니다. 따라야 할 좋은 규칙은 귀하의 질문이 귀하의 IDE 앞에 있다면, 그것이 SO에 속하는 것입니다. 질문이 있으면 화이트 보드 앞에서 볼 수 있습니다. 이 질문이 귀하를 위해 이전 될 수 있으므로 다시 보내지 마십시오. – Walter

+0

@ 월터 움직여주십시오. –

답변

2

Thread 클래스는 OS 스레드를 관리 할 수 ​​있으며 호출 스택과 아무 관련이 없습니다. StackTraceElement은 스택 프레임을 나타내지 만 도착하려면 StackTrace이 필요합니다.

스택 추적이 변경되는 경우 예를 들어 프레임이 추가되거나 (메소드가 입력되거나) 제거 (메소드가 종료 됨)되는 경우에 대한 통지를 찾고 있습니다.

이 작업에 가장 적합한 도구는 AspectJ입니다. 이 메소드를 사용하면 다른 메소드가 입력되거나 존재할 때 (다른 케이스 외에도) 호출되는 advices (메소드의 일종)을 정의 할 수 있습니다. 메서드 호출, 종료, 메소드는 와일드 카드를 사용하여 설명 할 수 있습니다. 포인트 컷 MyClass.get*은 MyClass의 모든 get 메소드에 적용됩니다. pointcuts은 메소드 입 력, 종료가 가능하며 와일드 카드를 사용하여 메소드를 설명 할 수 있습니다.

0

나는 당신의 대답을보기 전에 자기 자신을 쓰기 시작했다. 형태는 단순하지만 쉘은 다음과 같습니다.

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