2013-05-30 18 views
0

我想知道哪種方法或哪個類稱爲MyClass的構造函數。哪個Java方法稱爲我的構造函數?

public class MyClass 
{ 
    private static int instCount = 0; 

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

這已被問了很多次,唯一的辦法是創建一個異常並解析它的stacktrace(不好)。 – SJuan76

回答

7

您可以在不拋出它的情況下創建異常,並檢查其堆棧跟蹤以查找調用堆棧。

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

stackTrace數組中的元素0將是您的構造函數。元素1應該是調用構造函數的位置。

+0

我認爲值得注意的是,你也可以把打印部分放在一個循環中,循環說前5個元素,如果它們存在(需要檢查)。如果該構造函數在另一個類的構造函數中被調用以找出被調用的地方,那將很有用。 – LuigiEdlCarno

0

構造函數將在實例化對象時自動調用。如果要限制該行爲,則需要將構造函數的訪問修飾符設置爲private

0

以下是如何獲取調用MyClass()構造函數的Class.method()的名稱。

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,我們不需要拋出異常檢查堆棧跟蹤。但是,如果需要,我們可以進一步解析捕獲的調用方法文本,以刪除Java文件的名稱,如下所示。

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

您實際上不必拋出並捕獲您創建的異常。 – Henrik

+1

@Henrik Ah,剛剛檢查了你的答案。這樣更好。我會更新我的。謝謝。 –