2013-11-07 3 views
1

У меня есть три класса с именем FirstClass,SecondClass and ThirdClass. Здесь следует источник трех классов:Как получить иерархию звонков в java

FirstClass.java

public class FirstClass { 
    public void firstMethod(){ 
     SecondClass secondClass = new SecondClass(); 
     secondClass.secondMethod(); 
    } 
    public static void main(String[] args) { 
     FirstClass firstClass = new FirstClass(); 
     firstClass.firstMethod(); 
    } 

} 

SecondClass.java

public class SecondClass { 
    public void secondMethod(){ 
     ThirdClass thirdClass = new ThirdClass(); 
     thirdClass.thirdMethod(); 
    } 

} 

ThirdClass.java

public class ThirdClass { 
    public void thirdMethod(){ 
     System.out.println("Here i need to print where the call comes from,(call hierarchy) Is it possible?"); 
    } 
} 

На последнем методе (здесь ThirdClass.thirdMethod()) Мне нужно распечатать, откуда приходит вызов метода (я имею в виду иерархию вызовов). Так что я должен написать в thirdMethod() для этого

ответ

4

попробовать что-то вроде это доступ к стек вашего текущего потока:

Thread.currentThread().getStackTrace(); 

Это возвращает массив StackTraceElement который затем можно распечатать или проверить или делать то, что вы хотите.

Однако, будьте осторожны: Если ваш метод ведет себя по-разному в зависимости от вызывающего вашего метода (например, путем анализа стека и реагировать на него), вы можете создать некоторые действительно необычное и неожиданное поведение для anybode с помощью кода, как это.

1

Вы можете попробовать Thread.currentThread(). GetStackTrace()

Он возвращает массив StackTraceElement, который имеет метод GetClassName()

1

Вы можете попробовать Thread.currentThread().getStackTrace()

2

Попробуйте эту простую вещь:

Thread.dumpStack(); 

печать трассировки стека текущего потока в стандартный поток ошибок.

Для справки, http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html

Тонкое замечание, что он пишет в поток ошибок, так что вы можете перенаправить его по-другому, чем стандартный вывод консоли, как это:

java FirstClass >normaloutput.log 2>yourstackdumps.log 
3

Смотрите документацию для Thread.

В частности, Thread.currentThread().getStackTrace() извлекает информацию о трассировке, а Thread.dumpStack() печатает текущую трассировку стека.

Нет необходимости в странных хаках с Exception или что-то еще.

Смежные вопросы