2

System.outたとえば、リダイレクトするアプリケーションがあります。

  System.setOut(new PrintStream(System.out){
    @Override
    public void print(String string)
    {
      //TODO: find out who sent the print before processing string
    }
  });

print の呼び出しを stdout に送信しているクラスを特定できるようにしたいですか? これはありえないと思いますが、そう言わないと断定できませんSO

4

4 に答える 4

2

スタックトレースを取得し、現在のインデックスからクラス名を見つけます。

StackTraceElement[] trace = Thread.currentThread().getStackTrace();
于 2012-08-30T11:24:52.243 に答える
1

最新バージョンの HotSpot または OpenJDK を使用している場合は、これを使用できますReflection.getCallerClass(2 or 3)。これは完全なスタック トレースを生成するよりも効率的ですが、移植性はありません。

それ以外の場合、スタック トレースを取得する最も効率的な方法は次のとおりです。

StackTraceElement[] stes = Thread.currentThread.getStackTrace();

これにより、例外またはスロー可能オブジェクトの作成が回避されます。

于 2012-08-30T11:27:43.613 に答える
1

例外をスローして、スタック トレースを調べることができます。明らかに、製品コードには適していません。

于 2012-08-30T11:19:41.010 に答える
0

いくつかの方法があります。SecurityManagerが最適な場合があります。この投稿、特に2番目の回答を確認してください:スタックトレースまたはリフレクションを使用してメソッドの呼び出し元を見つけるにはどうすればよいですか?

于 2012-08-30T11:25:04.583 に答える