【问题标题】:Which Java method called my constructor? [duplicate]哪个 Java 方法调用了我的构造函数? [复制]
【发布时间】:2013-05-30 08:27:49
【问题描述】:

我想知道MyClass的构造函数是哪个方法或者哪个类调用的。

public class MyClass
{
  private static int instCount = 0;

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

【问题讨论】:

  • 这已经被问过很多次了,唯一的办法就是创建一个异常并解析它的堆栈跟踪(不好)。

标签: java class methods constructor call


【解决方案1】:

您可以创建一个异常而不抛出它,并检查它的堆栈跟踪以找到调用堆栈。

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

stackTrace 数组中的元素 0 将是您的构造函数。元素 1 应该是调用构造函数的位置。

【讨论】:

  • 我认为值得注意的是,您还可以将打印部分放在一个循环中,循环说前 5 个元素,如果它们存在(需要检查)。如果在另一个类的构造函数中调用该构造函数以找出调用的确切位置,那将很有用。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    以下是获取调用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()
    

    【讨论】:

    • 您实际上不必抛出并捕获您创建的异常。
    • @Henrik Ah,刚刚检查了你的答案。这样更好。我会更新我的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 2021-11-08
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    相关资源
    最近更新 更多