1

Java では、次のようなコードを記述してスタックに問い合わせることができます。

StackTraceElement[] stack = Thread.currentThread().getStackTrace();
for (StackTraceElement frame : stack) {
    System.out.println(frame.getClassName() + "." + frame.getMethodName());
}

クラスとメソッドの名前を取得するだけでなく、代わりにクラスとメソッドのインスタンスを取得する、スタックの反射ビューを取得することは可能ですか? クラス内の 2 つのメソッドが同じ名前 (パラメーターが異なる) を共有している場合、スタック上でそれらを区別できますか?

4

2 に答える 2

2

クラスとメソッドの名前を取得するだけでなく、代わりにクラスとメソッドのインスタンスを取得する、スタックの反射ビューを取得することは可能ですか?

クラス文字列Classを呼び出してインスタンスを取得できます。Class.forNameMatt Ballの回答を参照してください。(ネストされた/インナー/匿名クラスはもう少しトリッキーかもしれません...)

クラス内の 2 つのメソッドが同じ名前 (パラメーターが異なる) を共有している場合、スタック上でそれらを区別できますか?

ソース コードがある場合にのみ、アプリケーションはデバッグ情報を使用してコンパイルされ、それを解析して、どの行番号がどのメソッド オーバーロードに対応するかを判断できます。最後のものは、実装するのに多くの作業が必要であり、計算コストが高くなります。

(このアプローチにも理論上の問題があります。1 行に複数のメソッド オーバーロードを含む Java ソース コードを記述することは可能です。そうすると、メソッドとスタック トレースの情報を区別できなくなります。)

于 2012-10-05T03:06:35.360 に答える
2

Classビットは簡単です。使用Class.forName(String):

StackTraceElement[] stack = Thread.currentThread().getStackTrace();
for (StackTraceElement frame : stack) {
    String fqcn = frame.getClassName();
    Class<?> clazz = Class.forName(fqcn);
}

クラス内の 2 つのメソッドが同じ名前 (パラメーターが異なる) を共有している場合、スタック上でそれらを区別できますか?

によって返されるメソッド名にはパラメーター番号と型の情報が含まれていないため、そうは思いません。これStackTraceElement#getMethodName()は、同じ名前のメソッドを区別するために必要なものです。

于 2012-10-05T02:58:01.430 に答える