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