2013-09-05 15 views
7

Mam następujących klas (zauważ, że metody są statyczne):dostać rozmówcy nazwę klasy z odziedziczonej metody statycznej

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

I kiedy zadzwonić:

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

chciałbym uzyskać dane wyjściowe: AB zamiast BaseBase. Czy jest to nawet możliwe przy użyciu metod statycznych (w Javie 7)?

+0

co pan wylądować na jako preferowane rozwiązanie? – cdaringe

+0

@cdaringe Patrz zaakceptowana odpowiedź. –

Odpowiedz

6

Co można zrobić, ale nie powinno :) jest użycie metody Throwable getStackTrace. Poza zapachem jest to dość powolne, ponieważ uzyskanie śladu stosu nie jest tak szybkie. Ale otrzymasz tablicę StackTraceElement, a każdy będzie zawierał klasę klasy, która go wywołuje (i możesz także pobrać plik i linię, a jeśli oddzielisz te dwa za pomocą: możesz uzyskać klikalny link w zaćmienie, nie, żebym kiedykolwiek zrobił coś takiego ...).

Coś

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

nadzieję, że pomoże :)

+0

Witchery! :) * Poza zapachem, jest to dość powolne, ponieważ pobieranie śladu stosu nie jest tak szybkie. * Właściwie wydaje mi się, że jest to powolne kilka pierwszych uruchomień. Uważam, że HotSpot ma na to optymalizację. Pozwól mi spojrzeć na referencję ... – Muel

+0

Odsyłacz do poprzedniego komentarza: http://www.javaspecialists.eu/archive/Issue187.html – Muel

+0

Oczywiście spekuluję na temat prędkości, ponieważ nigdy bym tego nie zrobił rzecz, nawet jeśli miało to naprawdę uprościć debugowanie w stylu printf w czasie zaćmienia, ale gdybym to zrobił, nie zmierzyłbym tego; Po prostu domyśliłbym się, że koszt arbitralnych połączeń z użyciem funkcji getStackTrace może być znaczny. Dzięki za referencję. –

-1

Czy jest to możliwe przy użyciu metod statycznych (w języku Java 7)?

Nie, metody statyczne nie są dziedziczone. Tylko metody niestatyczne są dziedziczone.

W twoim przypadku zmiany Base (i podklasy) w następujący sposób:

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

małe wyjaśnienie byłoby miłe –

Powiązane problemy