调用Java中方法的调用者

Invoking the caller of a method in Java

本问题已经有最佳答案,请猛点这里访问。

只是想知道,如何找到调用另一个方法的方法的名称? 我想使用Method类。


您可以使用StackTraceElement:

1
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();

StackTraceElement数组中元素的顺序:数组的最后一个元素代表堆栈的底部,这是序列中最近的方法调用。

一旦有了所需的方法名称,就可以使用反射调用它:

1
2
Method lastMethod = YourClass.class.getMethod("yourMethodName");
lastMethod.invoke();

注意:应根据您的类和方法更改代码。


获取名称非常棘手,获取方法非常困难,因为您不知道参数列表,但是您知道类,并且在读取字节码时可以使用行号来查找包含该行的方法。如果该方法是静态的(我怀疑不是),则可以。如果您需要一个实例,则以任何可移植的方式找到几乎是不可能的实例。

您想要做的事情是Java的对等。如何通过几个简单的步骤来学习如何飞行。

您遇到的问题是,这极不可能是一个好的解决方案。如果您需要回调调用您的对象,则应将该对象作为参数传递,最好是通过接口传递。

每当您发现代码在其自身上运行时,肯定会以某种混乱结束,您想简化依赖关系。

您应该做的就是这样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
interface Callback< T > {
    onResult(T t);
}


class A implements Callback<MyResult> {
    B b = new B();
    public void method() {
        b.doSomething(this);
    }
    public void onResult(MyResult mr) {
        // do something with mr
    }
}

class B {
    public void doSomething(Callback<MyResult> cb) {
         // do something
         cb.onResult(new MyResult(something));
         // do something else
    }
}

当然,如果您只返回一个结果而不是一半的代码,而不是调用第一个方法,这将更加简单。这就是为什么通常当您要将某些内容传递回调用方时,使用返回值而不是递归的原因。