2013-09-05 15 views
7

Ich habe folgende Klassen (beachten Sie, dass Methoden sind statisch):Anrufer Klassenname von vererbten statische Methode erhalten

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(); 
    } 
} 

Und wenn ich rufe:

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

I Ausgabe erhalten möchten: AB anstelle von BaseBase. Ist es sogar mit statischen Methoden (in Java 7) möglich?

+0

hilft, was Sie als die bevorzugte Lösung landen haben? – cdaringe

+0

@cdaringe Siehe akzeptierte Antwort. –

Antwort

6

Was Sie tun können, sollte aber nicht :) ist die Methode Throwable getStackTrace verwenden. Abgesehen von dem Geruch ist das ziemlich langsam, weil die Stapelverfolgung nicht so schnell ist. Aber Sie erhalten ein Array von StackTraceElement, und jedes enthält die Klasse der Klasse, die es aufruft (und Sie können auch die Datei und die Zeile erhalten, und wenn Sie die beiden mit einem trennen: Sie können einen anklickbaren Link in Sonnenfinsternis, nicht dass ich jemals so etwas tun würde ...).

So etwas wie

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

Hope that :)

+0

Witchery! :) * Abgesehen von dem Geruch, ist das ziemlich langsam, weil die Stapelverfolgung nicht so schnell ist. * Eigentlich denke ich, es ist nur langsam die ersten paar Male es läuft. Ich glaube, HotSpot hat Optimierungen dafür. Lassen Sie mich nach der Referenz suchen ... – Muel

+0

Referenz für den vorherigen Kommentar: http://www.javaspecialists.eu/archive/Issue187.html – Muel

+0

Natürlich spekuliere ich über die Geschwindigkeit, weil ich so etwas nie tun würde nicht einmal, wenn es das Debugging im Printf-Stil in Eclipse wirklich vereinfachen würde, aber wenn ich es getan hätte, hätte ich es nicht gemessen; Ich hätte lediglich vermutet, dass die Kosten für willkürliche getStackTrace-Aufrufe erheblich sein könnten. Danke für die Referenz. –

-1

Ist es sogar mit statischen Methoden (in Java 7) möglich?

Nein, statische Methoden werden nicht vererbt. Nur nicht statische Methoden werden vererbt.

In Ihrem Fall ändern Base (und Subklassen) wie folgt:

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

eine kleine Erklärung wäre nett –