8

如何检查哪个类调用了我的方法?

例如:如果 A 类在 C 类中使用了 MethodB,那么如果 B 类调用 MethodB,则该函数应该做一些其他的事情。

我不能在方法中添加布尔值或类似的东西。

4

6 回答 6

6

没有好的方法可以做到这一点——这从根本上是一个糟糕的设计,IMO。如果 ClassA 和 ClassB 想要不同的事情发生,他们应该调用不同的方法。

根据我的经验,唯一合理的情况是尝试制定一种初始化记录器的简单方法时,基本上您希望调用类名称成为记录器名称的一部分。一种可怕的方法是抛出并捕获异常,然后查看它的堆栈跟踪。但尽可能避免...

于 2013-11-08T13:29:06.030 回答
5

可以找到调用方法的类的名称。这是实现它的方法。

class A {

    public void testMethodCall() {
        new C().testMethod();
    }
}

class B {
  public void testMethodCall() {
      new C().testMethod();
  }
}

class C {

    public void testMethod() {
        System.out.println("Called from class : " +Thread.currentThread().getStackTrace()[2].getClassName());
    }
}
public class Test
{
    public static void main(String args[]) {
        A a = new A();
        B b = new B();
        a.testMethodCall();
        b.testMethodCall();
    }

}

输出

从类调用:A

从类调用:B

您可以使用此示例代码来适应您的需要。

于 2013-11-08T13:34:51.073 回答
4
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace()  

文档:

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

以及您可以从每个项目中获得什么的文档StackTraceElement

http://docs.oracle.com/javase/7/docs/api/java/lang/StackTraceElement.html

getClassName()
getFileName()
getLineNumber() 
getMethodName()
于 2013-11-08T13:31:28.430 回答
1
class A {
     B().foo()
}

class B {
     fun foo() {
         val className = Throwable().stackTrace[1].className.substringAfterLast('.')
         Log.d(TAG, className) //prints "A"
     }
}
于 2021-03-15T19:10:36.603 回答
0

您可以以这种方式打印堆栈恍惚:

@Override
public void finish() {
    new Exception("").printStackTrace(); 
}
于 2018-07-22T08:43:53.757 回答
0

我回答太晚了。您可以使用Thread.dumpStack()检查谁在调用您的函数。

假设你想检查谁在调用函数 ABC()。然后你可以编写如下代码:

function ABC(){
   Thread.dumpStack()
   ......
   .....
   Rest of your code

}

当 Thread.dumpStack() 将被执行时,它将打印一个堆栈跟踪。
你可以参考这个链接
注意,这个功能不仅限于线程,它可以在任何地方使用/

于 2018-08-01T06:46:13.000 回答