5

次のように定義された2つのクラスがあります。

class A {
    public static String getName(){
        Class c = getCalledClass();
        return c.getSimpleName();
    }
}

class B extends A {
    //no methods are defined here!
}

呼び出しが返され、返されるようにstaticメソッドを構成できるかどうかを知りたいですか?getCalledClass()A.getName()AB.getName()B

ありがとう。

4

4 に答える 4

7

これは、少なくともあなたが尋ねた一般的な意味では不可能です。

方法ありませんB.getName()。それをコードに入力することはできますが、同じバイトコードにコンパイルされA.getName()ます (コンパイラの警告も表示されると思います)。

したがって、実行時に、誰かが静的メソッドをどのように参照したかを知る方法はありません。呼び出し元が使用しているローカル変数名を知る方法がないのと同じです。

于 2013-07-05T11:56:59.050 に答える
0

javac コンパイラが への呼び出しを検出するとB.getName()、その場で に解決し、バイト コードA.getName()に への静的呼び出しを配置し​​ます。A.getName()

バイトコードからソースコードで使用されている形式を推測できるメカニズムは Java には存在しません。

B.getName()とは異なるメソッドになりたい場合は、でA.getName()呼び出されるメソッドを定義する必要があります。そのメソッドでは、呼び出されるクラスは常に「B」になるため、スタック トレースやその他のメカニズムをいじる必要はありません。ただし、通常、ドットの前が重要であると考える場合は、代わりに使用するより優れたオブジェクト指向設計がおそらくあります。getName()B

于 2013-07-05T12:00:48.320 に答える