2016-06-24 3 views
0

В Java можно определить, вызван ли статический метод из экземпляра объекта или статически (SomeClass.method())?Java: определить, вызывается ли статический метод из экземпляра или статически

Чтобы дать Вам лучшее представление о том, что я говорю о том, взять посмотреть на этот код ниже:

public class SomeClass { 

    public static void staticMethod() { 

     if (/*called from instance*/) { 
      System.out.println("Called from an instance."); 
     } else if (/*called statically*/){ 
      System.out.println("Called statically."); 
     } 
    } 

    public static void main(String[] args) { 
     new SomeClass().staticMethod();//prints "Called from an instance." 
     SomeClass.staticMethod();//prints "Called statically." 
    } 

} 

Я понимаю, что это не хорошая практика, чтобы вызвать статический метод из экземпляра, но все же, можно ли различать эти два вызова? Я думал, что API Reflection, вероятно, имеет к этому ключ.

+0

Почему не SomeClass.staticMethod (someclassObj)? – waltersu

+2

Это невозможно, он компилируется точно таким же байт-кодом. – tkausl

+1

Нет. Насколько я знаю, эти два вызова составляют точно такой же байт-код. (И @tkausl побеждает на 14 секунд) – ajb

ответ

1

Это невозможно, просто вызвав метод. Однако вы можете получить полезную информацию от StackTrace объясняется здесь How do I find the caller of a method using stacktrace or reflection?

Это позволит вам определить имя метода и/или класс вызывающего абонента, используя статический метод

+0

Не совсем ответ. – shmosel

+0

ОК. чтобы прямо сказать, что это невозможно, что является ответом. –

+0

В этом примере имя класса/метода вызывающего абонента было бы одинаковым для обоих случаев. – Thilo

1

Я не думаю, что отражение может сделать это. Но вы можете сделать это по-другому:

public class SomeClass { 

    public static void staticMethod(boolean isStaticCall) { 

     if (!isStaticCall) { 
      System.out.println("Called from an instance."); 
     } else{ 
      System.out.println("Called statically."); 
     } 
    } 

    public static void main(String[] args) { 
     new SomeClass().staticMethod(false);//prints "Called from an instance." 
     SomeClass.staticMethod(true);//prints "Called statically." 
    } 

} 
+1

Звонящий мог лгать об этом. – Thilo

+0

Абсолютно! Во всяком случае, java-программа никогда не будет достаточно сильной. Например: частный внутренний класс. – expoter