Java 检查哪个类调用了函数

Java 检查哪个类调用了函数,java,Java,如何检查哪个类调用了我的方法 例如:如果类A在类C than中使用MethodB,那么如果类B调用MethodB,则函数应该执行该函数将执行的其他操作 我不能在方法中添加布尔值或类似的东西。没有好的方法来做这件事,我认为这从根本上说是一个糟糕的设计。如果ClassA和ClassB希望发生不同的事情,他们应该调用不同的方法 根据我的经验,这唯一合理的时间是在尝试制定一种初始化记录器的简单方法时,基本上您希望调用类名成为记录器名称的一部分。一种可怕的方法是抛出并捕获异常,然后查看其堆栈跟踪。但是如果

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

例如:如果类A在类C than中使用MethodB,那么如果类B调用MethodB,则函数应该执行该函数将执行的其他操作


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

没有好的方法来做这件事,我认为这从根本上说是一个糟糕的设计。如果ClassA和ClassB希望发生不同的事情,他们应该调用不同的方法

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

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

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

以及您可以从每个
StackTraceeElement


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

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班呼叫


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

您可以通过这种方式打印stack trance:

@Override
public void finish() {
    new Exception("").printStackTrace(); 
}

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

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

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

}
当Thread.dumpStack()将被执行时,它将打印stacktrace。
您可以参考

请注意,此函数不仅限于线程,还可以在任何地方使用/

不要实现这样的逻辑。如果一个方法取决于调用该方法的人,那么它就不是非常可重用的。若你们需要做一些不同的事情,那个么看看命令模式或者类似的东西。好的初学者会问,但不要这样做。创建单独的方法。如果你发布一个代码示例,那么我们可以给你更好的建议。但是如果你真的想知道调用方,不是为了操纵逻辑,而是为了一些重要的原因,比如说,记录东西呢?@Aniket:如果你正在记录一个堆栈跟踪(通常是这样),那无论如何都会包括调用方。但我的主要观点是OP写的函数会根据调用者做不同的事情,这听起来是个坏主意。这对我来说只是一个“短时间”的解决方案,因为有JUnit测试必须工作,并且只能处理旧的部分,所以我必须检查调用我的方法的方法是否来自JUnit类。技术上来说,是的,但请不要在没有警告的情况下给出建议。一点知识等。。。
class A {
     B().foo()
}

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

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