2013-09-05 5 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(); 

Я хотел бы получить выход: AB вместо BaseBase. Возможно ли это с помощью статических методов (в Java 7)?

+0

что вы землю в качестве предпочтительного решения? – cdaringe

+0

@ cdaringe См. Принятый ответ. –

ответ

6

Что вы можете сделать, но не стоит :) это использовать метод Throwable getStackTrace. Помимо запаха, это довольно медленно, потому что получение трассировки стека не так быстро. Но вы получите массив StackTraceElement, и каждый из них будет содержать класс класса, который его вызывает (и вы также можете получить файл и строку, и если вы разделите их с помощью:: вы можете получить доступную ссылку в затмение, а не то, что я когда-либо делал бы такое ...).

Что-то вроде

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

Надежда, что помогает :)

+0

Witchery! :) * Помимо запаха, это довольно медленно, потому что получение трассировки стека не так быстро. * На самом деле, я думаю, что это происходит только в первые несколько раз. Я считаю, что HotSpot имеет оптимизацию для этого. Позвольте мне взглянуть на ссылку ... – Muel

+0

Ссылка на предыдущий комментарий: http://www.javaspecialists.eu/archive/Issue187.html – Muel

+0

Конечно, я размышляю о скорости, потому что я никогда не сделаю такого но даже если бы он действительно упрощал отладку в стиле затмения в стиле printf, но если бы у меня было, я бы не измерил ее; Я просто предположил бы, что стоимость произвольных вызовов getStackTrace может быть значительной. Спасибо за ссылку. –

-1

Возможно ли это с помощью статических методов (в Java 7)?

Нет, статические методы не наследуются. Наследуются только нестатические методы.

В вашем случае изменение Base (и подклассы) следующим образом:

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

немного объяснений было бы хорошо –

Смежные вопросы