我有一个应用程序,例如重定向System.out
;
System.setOut(new PrintStream(System.out){
@Override
public void print(String string)
{
//TODO: find out who sent the print before processing string
}
});
我希望能够确定哪个类正在将调用发送到stdout?我认为这是不可能的,但除非SO
这样说,否则不能完全结束。
答案 0 :(得分:2)
获取stacktrace并从当前索引中找到类名。
StackTraceElement[] trace = Thread.currentThread().getStackTrace();
答案 1 :(得分:1)
您可以抛出异常,并检查堆栈跟踪。显然不适合生产代码。
答案 2 :(得分:1)
如果您有最新版本的HotSpot或OpenJDK,则可以使用Reflection.getCallerClass(2 or 3)
这比生成完整堆栈跟踪但不可移植更有效。
否则,获得堆栈跟踪的最有效方法是
StackTraceElement[] stes = Thread.currentThread.getStackTrace();
这可以避免创建Exception或Throwable。
答案 3 :(得分:0)
有很多方法:SecurityManager可能是最好的。请查看此帖子,尤其是第二个答案:How do I find the caller of a method using stacktrace or reflection?