2013-09-05 21 views
7

から、発信者のクラス名を取得し、私はクラス(メソッドが静的であることに注意)次ています継承された静的メソッド

class Base 
{ 
    public static void whosYourDaddy() 
    { 
     Class callerClass = // what should I write here to get caller class? 
     System.out.print(callerClass.getName()); 
    } 
} 

Class A extends Base 
{ 
    public static void foo() 
    { 
     A.whosYourDaddy(); 
    } 
} 

Class B extends Base 
{ 
    public static void bar() 
    { 
     B.whosYourDaddy(); 
    } 
} 

そして、私は電話を:

A.foo(); 
B.bar(); 

私は出力を取得したいのです: BaseBaseの代わりに AB静的メソッド(Java 7)でも可能ですか?

+0

あなたは好ましい解決策として何に着陸しましたか? – cdaringe

+0

@cdaringe受け入れられる回答を参照してください。 –

答えて

6

を、しかし:)のThrowable getStackTraceメソッドメソッドを使用しているべきではありません:あなたのケースを変更Base(およびサブクラス)で

としては、以下の通りです。においを除いて、これはかなり遅いです、なぜならスタックトレースを得ることはそれほど速くないからです。しかし、あなたはStackTraceElementの配列を取得し、各クラスにはそれを呼び出すクラスのクラスが含まれます(また、ファイルと行を取得することもできます)。日食、そういうことをやっているわけではない...)。

役立ちます:)

String className = new Throwable().getStackTrace()[1].getClassName(); 

希望のようなもの

+0

Witchery! :) *匂いを除いて、これはかなり遅いです。なぜなら、スタックトレースを得ることはそれほど速くないからです。*実際には、最初の数回は遅くなります。私はHotSpotがこれに対して最適化していると信じています。私は参照を見てみましょう... – Muel

+0

前のコメントの参照:http://www.javaspecialists.eu/archive/Issue187.html – Muel

+0

もちろん私はそのような実際にprintf形式のデバッグをeclipseで単純化したとしても、私が持っていたとしても、私はそれを測定していないでしょう。私は単に、任意のgetStackTrace呼び出しのコストが重要であると推測しています。参照ありがとう。 –

-1

(Java 7の)静的メソッドでも可能ですか?

いいえ、静的メソッドは継承されません。非静的メソッドだけが継承されます。あなたは何ができるか

class Base 
{ 
    public void whosYourDaddy() 
    { 
    Class<?> callerClass = getClass(); 
    System.out.print(callerClass.getName()); 
    } 
} 
0

 private static class Reflection { 
    private static final SecurityManager INSTANCE = new SecurityManager(); 
    static Class getCallClass() { 
     return INSTANCE.getCallClass(2); 
    } 
    private Reflection() { 
    } 
    private static class SecurityManager extends java.lang.SecurityManager { 
     public Class getCallClass(int i) { 
      Class[] classContext = getClassContext(); 
      if (i >= 0 && i + 1 < classContext.length) { 
       return classContext[i + 1]; 
      } 
     return null; 
     } 
    }; 
}

+0

少し説明がいいだろう –

関連する問題