如何确定哪个类通过System.out发送消息

时间:2012-08-30 11:12:44

标签: java

我有一个应用程序,例如重定向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这样说,否则不能完全结束。

4 个答案:

答案 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?