4

私を呼び出している完全なメソッド シグネチャを取得する方法を見つけようとしています。

例えば:

public class Called {

    public void whoCallMe() {
        System.out.println("Caller Method: " + new Throwable().getStackTrace()[1].getMethodName());
    }
}

public class Caller {

public static void run(int i) {
    new Called().whoCallMe();
}

public static void run(String str) {
    new Called().whoCallMe();
}

public static void run(boolean b) {
    new Called().whoCallMe();
}

/** MAIN **/
public static void main(String[] args) {
    run("hi");
}

whoCallMe() メソッドを実装した方法では、run メソッドがそれを呼び出していることがわかりますが、オーバーロードが 3 つあるため、whoCallme はメソッド名として「run」のみを返すため、どちらが呼び出し元であるかはわかりません。

run(java.lang.String) のような完全なメソッド署名を取得できる他の方法を知っていますか?

4

1 に答える 1

2

AspectJを使用して、すべてのメソッド呼び出しに適用されるアスペクトを作成し、呼び出されるメソッドに関する詳細をスレッドごとのスタックに追加し、メソッドの完了後にそれを削除できます。もちろん、それはめちゃくちゃ高価になるでしょう。ほとんどの場合、あなたはそれをしたくないでしょう。また、誰があなたを呼んだかを知るために何も投げたくありません。

基本的にあなたの質問への答えは次のとおりです:それをしないでください。あなたがそれをやりたいと思う理由を説明してください。そうすれば誰かがあなたに良い選択肢を与えるでしょう。

また、考えてみると、メソッドのオーバーロード(オーバーライドではない!)は有害であると見なされていると主張できます。異なる引数と同じ名前を持つ複数の異なるメソッドが本当に必要ですか?

于 2012-04-05T18:44:54.373 に答える