Какой класс вызвал мой статический метод? - PullRequest
8 голосов
/ 12 ноября 2008

Предположим, у меня есть класс Java со статическим методом, например:

class A
{
    static void foo()
    {
        // Which class invoked me?
    }
}

И, кроме того, предположим, что класс A имеет произвольное количество подклассов:

class B extends A { }
class C extends A { }
class D extends A { }
...

Теперь рассмотрим следующие вызовы методов:

A.foo();
B.foo();
C.foo();
D.foo();
...

Мой вопрос: как метод foo() может определить, какой класс его вызывает?

Ответы [ 3 ]

10 голосов
/ 12 ноября 2008

Не может, и это является частью проблемы со статическими методами. Что касается компилятора, A.foo() и B.foo() - это одно и то же. Фактически они компилируются в один и тот же байт-код. Вы не можете получить больше похожего, чем это.

Если вам действительно нужна такая информация, используйте одиночный код и включите foo() в метод экземпляра. Если вам все еще нравится статический синтаксис, вы можете построить фасад A.foo().

4 голосов
/ 12 ноября 2008

Хотя вы не можете выяснить, к какому классу статический метод был вызван , можно выяснить, какой класс вызвал метод во время выполнения:

static void foo()
{
   Throwable t = new Throwable();
   StackTraceElement[] trace = t.getStackTrace();
   String className = trace[1].getClassName();
   Class whoCalledMe = null;
   try
   {
      whoCalledMe = Class.forName( className );
   }
   catch( Exception e )
   {
   }
}

Я не говорю, что это хорошая практика и, вероятно, она не очень хороша с точки зрения производительности, но она должна работать. Не знаю, поможет ли это вам ...

3 голосов
/ 12 ноября 2008
class A
{
    static void foo(A whoIsCalingMe)
    {
        // Which class invoked me?
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...