2013-05-30 3 views
0

Я хотел бы знать, какой метод или какой класс называется конструктором MyClass.Какой метод Java вызвал мой конструктор?

public class MyClass 
{ 
    private static int instCount = 0; 

    public MyClass() 
    { 
    instCount++; 
    System.out.println("MyClass Konstruktor wurde aufgerufen! [" + instCount + "]"); 
    } 
} 
+4

Это задано много раз, единственный способ создать исключение и проанализировать его стек (не приятно). – SJuan76

ответ

7

Вы можете создать исключение, не бросая его, и проверить его трассировку стека, чтобы найти стек вызовов.

RuntimeException ex = new RuntimeException(); 
StackTraceElement[] stackTrace = ex.getStackTrace(); 
System.out.println(stackTrace[0]); 
System.out.println(stackTrace[1]);  

Элемент 0 в массиве stackTrace будет ваш конструктор. Элемент 1 должен быть местом, откуда был вызван конструктор.

+0

Я думаю, стоит отметить, что вы можете также поместить часть печати внутри цикла, зациклившись на первые 5 Elemnts, если они существуют (требуется проверка). Это было бы полезно, если бы этот конструктор был вызван внутри конструктора другого класса, чтобы узнать, где именно это вызвано. – LuigiEdlCarno

0

Конструкторы будут вызываться автоматически при создании объекта. Если вы хотите ограничить это поведение, которое вы должны сделать модификатор доступа конструктора быть private

0

Вот как получить имя Class.method(), вызвавшей в MyClass() конструктор.

public static void main(String[] args) { 
    new MyClass(); 
} 

public MyClass() { 
    StackTraceElement[] stackTrace = new Exception().getStackTrace(); 
    System.out.println(stackTrace[1]); // prints MyClass.main(MyClass.java:7) 
} 

Мы сгенерирует исключение, но поймать его во времени Как указал на @Henrik ниже, мы не должны бросать исключения для проверки StackTrace. Но при необходимости мы можем дополнительно проанализировать текст метода захваченного метода invoker, чтобы удалить имя файла Java следующим образом.

System.out.println(
      stackTrace[1].toString().split("\\(")[0]+"()"); // prints MyClass.main() 
+0

Вам не нужно бросать и ловить созданное вами исключение. – Henrik

+1

@ Хенрик Ах, просто проверил ваш ответ. Так-то лучше. Я обновлю свое. Благодарю. –

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