如何找出哪个类/方法调用了实际方法?
答案 0 :(得分:8)
您可以尝试创建一个例外来获取其堆栈跟踪。
Throwable t = new Throwable();
StackTraceElement[] stackTraceElements = t.getStackTrace();
现在stackTraceElement[0]
包含当前方法的调用者。
但要注意(来自Throwable.getStackTrace()):
某些虚拟机可能在某些情况下 情况,省略一个或多个堆栈 堆栈跟踪中的帧。在里面 极端情况下,虚拟机 没有堆栈跟踪信息 关于这个扔掉是允许的 返回一个零长度数组 这种方法。一般来说, 这个方法返回的数组会 每帧包含一个元素 这将由印刷 的printStackTrace。
答案 1 :(得分:5)
这是我用过的一种方式:
StackTraceElement element=Thread.currentThread().getStackTrace()[3];
String className=element.getClassName();
String methodName=element.getMethodName();
[3]是硬编码的,因为:
[0]是Thread.dumpThreads()
[1]是Thread.getStackTrace()
[2]是当前的方法
[3]是当前方法之前的那个
答案 2 :(得分:1)
更快但不便携的解决方案是使用以下方法。它不会创建堆栈跟踪,只是为您提供所需的信息。但是,并非所有JVM都具有此功能,未来版本的Java也可能不会。
Class callerClass = sun.reflect.Reflection.getCallerClass(2);
答案 3 :(得分:0)
您可以打印堆栈跟踪来执行此操作。
如果你想动态地这样做,我不确定这是否可行(除了动态打印和解析堆栈跟踪)。
答案 4 :(得分:0)
您可以使用调试器或分析器。 Netbeans有这两种选择,但还有很多其他选择。
否则,如果您可以修改代码,则可以抛出一个新的异常()并在控制台中打印一个堆栈跟踪。
答案 5 :(得分:0)
回应并详细说明matt b和yishai的评论:
如果您这样做是因为您正在编写记录器或维护跟踪信息或某些此类信息,那么,很酷。我在生产代码中只使用了一次堆栈跟踪,甚至那确实是一个调试问题:我们遇到了数据库连接未正确关闭的问题,因此我修改了“获取数据库连接”功能以保存调用者的身份,然后定期扫描以查找死连接并查看它们的创建位置。
Java的内置日志记录功能会堆栈跟踪,因此可以将调用记录器的人写入日志文件。我担心这会产生开销,因为据我所知,堆栈跟踪很昂贵,但无论如何。
但是如果你这样做是因为你的函数的行为会有所不同,具体取决于它的调用位置,例如“如果从类X调用,则更新客户数据,如果从类Y调用更新员工数据”,或类似的东西:真是个坏主意。传递参数或编写单独的函数。