【问题标题】:Invoking the caller of a method in Java [duplicate]在Java中调用方法的调用者[重复]
【发布时间】:2013-11-04 05:37:32
【问题描述】:

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

【问题讨论】:

    标签: java


    【解决方案1】:

    您可以使用StackTraceElement

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

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

    一旦你有了想要的方法名,你就可以使用反射来调用它:

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

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

    【讨论】:

    • 我将如何调用该方法?
    • @FlameKnight123 一旦你有了方法名,你就可以使用反射来调用它。
    • 我知道我可能会很痛苦,但是您如何使用反射来调用它?因为我是 Reflection 的新手......
    • @FlameKnight123 检查我更新的答案。我假设该方法不需要参数。但是您可以根据需要更改代码。
    • 得到了那个部分.....但是你首先如何得到这个名字?
    【解决方案2】:

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

    您正在尝试做的事情是 Java 等价于说;如何通过几个简单的步骤学会飞行。

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

    当你发现代码自行运行时,这肯定会以某种混乱结束,你想简化你的依赖关系。

    你应该做的是这样的。

    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
        }
    }
    

    当然,如果不是回调第一个方法,而是只返回一个结果并且不需要一半的代码,这一切都会简单得多。这就是为什么通常当你想将某些东西传回给调用者时,你会使用返回值而不是递归。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      相关资源
      最近更新 更多