2011-12-27 3 views
1

У меня есть class X, и в нем есть метод static под названием doStuff(), и по какой-то причине у меня есть несколько других классов с методами, вызывающими doStuff(). Есть ли способ, например, иметь метод печати в doStuff(), который печатает, из каких методов и классов он вызывается?Как я могу получить класс и метод, вызывающие статический метод?

+0

Пожалуйста, не» Это сделать! (С возможным исключением отладки, но даже там тестирование, вероятно, будет лучше.) –

ответ

4

Да: new Throwable().getStackTrace() возвращает массив StackTraceElement. Индекс номер 1 является вашим абонентом.

+1

+1: Или 'Thread.currentThread(). GetStackTrace()' –

+0

Спасибо, но индекс, который я использовал, был 3. Индекс 1 дает мне имя класса A и doStuff(). – nyxz

2
/** 
* <li> 0 dumpThreads 
* <li> 1 getStackTrace 
* <li> 2 getCallingMethodName 
* <li> 3 [calling method] 
* 
* @return 
*/ 
private String getCallingMethodName() { 
    return Thread.currentThread().getStackTrace()[3].getMethodName(); 
} 
1

Вы можете получить класс вызывающего абонента с помощью:

package test; 

class TestCaller { 
    public static void meth() { 
     System.out.println("Called by class: " + sun.reflect.Reflection.getCallerClass(2)); 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     TestCaller.meth(); 
    } 
} 

Выход: "Вызывается класса: класс test.Main"