1

我正在浏览 API 并尝试用谷歌搜索,但我想我不能正确地用词或它不可能。我的问题是:是否可以让方法根据调用位置执行特定的代码序列?

4

3 回答 3

4

您可以获取当前的堆栈跟踪并从中找出哪个方法调用了您的当前方法。

但是,这似乎非常肮脏,因此您应该确保您的用例确实保证了这种方法,而不是仅仅向方法添加参数或创建不同的方法。

于 2013-03-07T14:29:30.983 回答
3

它看起来像是继承和两种不同实现的好地方

于 2013-03-07T14:31:09.163 回答
3

对的,这是可能的。但这可能是个坏主意。

实现这种事情的一种方法是这样的:

public void myMethod(...) {
    Exception ex = new Exception();
    StackTraceElement caller = ex.getStackTrace()[1];
    if (caller.getMethod().equals("someMethod") {
        // do this 
    } else {
        // do that
    }
}

StackTraceElement 给出方法的名称、声明类的名称以及源文件的名称和源代码行号(如果可用)。

为什么这是一个坏主意有几个原因:

  • 这种东西往往很脆弱。很难预先预测将从哪里调用方法,也很难预测未来某个时间可能由另一个开发人员做出的更改。
  • 构建堆栈跟踪数组的成本很高,尤其是在堆栈很深的情况下。
  • 它违反了“最小意外”规则。开发人员不希望方法具有那样的行为。
  • 很可能有更好的方法来做……无论你想要实现什么。
于 2013-03-07T14:31:53.163 回答