0

私のクエリは、次のように3つのクラスがあると仮定して、いくつかのクラスがあるとします。

私の更新されたクエリを参照してください。それが彼らが求めたケースです。

class MethodContainerA {
    public void display() {
        System.out.println("Display from MethodContainerA");
    }
}

class MethodContainerB extends MethodContainerA {
    public void display() {
        System.out.println("Display from MethodContainerB");
    }
}

class MethodContainerC extends MethodContainerB {

}

public class MethodCallRecognization {
    public static void main(String[] args) {
        MethodContainerC methodContainerC = new MethodContainerC();
        methodContainerC.display();

            // I want to know here
    }
}

私の質問は、呼び出した後display()、どのクラスからメソッドが呼び出されたかという情報を取得できるかということです。この質問はデバッグ目的ではないことに注意してください。これは理論上のものです。

4

3 に答える 3

3

まあ、実際にはおそらくこれを行う方法があります(試していません):

使用されているインスタンスの Class を取得します。メソッドを取得するには getDeclaredMethod を実行します。メソッドで getDeclaringClass を実行します。

于 2013-04-24T16:55:18.417 に答える
1

display()から呼び出すMethodContainerCため、 が出力されDisplay from MethodContainerCます。

これがオーバーライドの仕組みです。スーパークラスのメソッドを呼び出したい場合はsuper、オーバーライドされたメソッド内から明示的に呼び出す必要があります。それ以外の場合は、オーバーライドされたメソッドを呼び出すことになります。

display()ただし、 にメソッドがない場合は、代わりにの表示メソッドMethodContainerCを呼び出します。MethodContainerBこれは、継承が最も近いパスに従うためです。

  • MethodContianerAメソッドがありdisplay()ます...
  • MethodContainerB...によってオーバーライドされます
  • (これは によってオーバーライドされMethodContianerCます。)

最後のステップをMethodContainerB省略display()しても、すべてのMethodContainerC. メソッドの最も近い実装が常に実行されます。

于 2013-04-24T16:43:41.663 に答える