检查哪个类调用了函数

时间:2013-11-08 13:27:33

标签: java

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

例如:如果A类使用C类中的MethodB,那么如果B类调用MethodB,该函数应该执行除函数之外的其他操作。

我无法在方法中添加布尔值或类似的内容。

6 个答案:

答案 0 :(得分:6)

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

时间这在我的经验中是合理的,当我试图找出一种初始化记录器的简单方法时,基本上你希望调用类名是记录器名的一部分。一种可怕的方法是抛出并捕获异常,然后查看其堆栈跟踪。但是尽可能避免......

答案 1 :(得分:4)

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

的Javadoc:

  

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

以及您可以从每个StackTraceElement

获取的内容的文档

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

getClassName()
getFileName()
getLineNumber() 
getMethodName()

答案 2 :(得分:4)

可以找到调用方法的类名。以下是如何实现它。

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

您可以使用此示例代码来满足您的需求。

答案 3 :(得分:1)

class A {
     B().foo()
}

class B {
     fun foo() {
         val className = Throwable().stackTrace[1].className.substringAfterLast('.')
         Log.d(TAG, className) //prints "A"
     }
}

答案 4 :(得分:0)

您可以在应用程序的那个函数中放置一个已处理的异常,以打印堆栈跟踪,并且通过处理它,您的应用程序仍然可以运行。 就像下面我的android应用中的示例一样,我想知道是什么导致我的活动结束:

@Override
public void finish() {
    try{
       test.finish();
    }
    catch (Exception e)
    {   
       Log.e(TAG,"FUNCTION : finish");
        e.printStackTrace();
    }
    super.finish();
}

答案 5 :(得分:0)

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

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

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

}

执行Thread.dumpStack()时,将打印堆栈跟踪。
您可以参考this link
请注意,此功能不仅限于线程,还可以在任何地方使用