0

我想知道哪个方法或哪个类调用了MyClass.

public class MyClass
{
  private static int instCount = 0;

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

3 回答 3

7

You can create an exception without throwing it, and inspect its stack trace to find the call stack.

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

Element 0 in the stackTrace array will be your constructor. Element 1 should be the location from where the constructor was invoked.

于 2013-05-30T08:31:11.630 回答
0

构造函数将在对象的实例化时自动调用。如果要限制该行为,则需要将构造函数的访问修饰符设为private

于 2013-05-30T08:42:23.797 回答
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 所指出的,我们不需要抛出异常来检查堆栈跟踪。但是,如果需要,我们可以进一步解析捕获的调用程序方法文本以删除 Java 文件的名称,如下所示。

System.out.println(
           stackTrace[1].toString().split("\\(")[0]+"()");  // prints MyClass.main()
于 2013-05-30T08:44:01.887 回答