2014-01-28 2 views
2

Итак, я хочу иметь возможность получить экземпляр подкласса, который запускается, когда он вызывает метод из суперкласса. Например, если у меня был этот класс:Получение экземпляра подкласса, расширяющего суперкласс при вызове метода

public class A { 
public void aMethod() { 
    //Here is where I want to see if class B is calling the code 
} 
} 

public class B extends A { 
} 

public class C { 
B b = new B(); 
b.aMethod(); 
} 

И, как говорится в комментариях, я хочу, чтобы проверить, в aMethod, если класс B, подкласс класса А, звонит код.

+0

Тот факт, что 'B' расширяет' A' здесь, в основном, не имеет значения; вы не создали экземпляр 'B' здесь ... –

+0

Код даже не компилируется. –

+0

Исправлено. Спасибо за указание на то, что out :) – nhthecoder

ответ

4

Как уже было отмечено, к вам, там почти никогда не хороший повод, чтобы сделать это и я согласен, что вы должны использовать полиморфизм вместо. Однако, если «нужно», чтобы сделать это, или просто хотите знать, как идти о делать что-то вроде этого, вы можете использовать instanceof на this внутри метода:

class A { 
    public void aMethod() { 
     if (this instanceof B) { 
      System.out.println("I'm a B!"); 
     } 
    } 
} 

public class B extends A { 

    public static void main(String[] args) { 
     B b = new B(); 
     b.aMethod(); 
    } 
} 
+2

Это правильный способ ответить на вопрос, но я хочу еще раз подчеркнуть, что я сказал в своем комментарии: ** не делайте этого **. Полиморфизм был изобретен, так что программистам не пришлось бы писать такие вещи. – ajb

+0

Согласен. Обновлен ответ на повторную итерацию. –

0

Обратите внимание, что это находит вызов в любой глубина:

for(final StackTraceElement element : Thread.currentThread().getStackTrace()) { 
    if (element.getClassName().equals(B.class.getName())) { 
    System.out.println("BINGO");  
    } 
} 

Если вы хотите проверить только ограниченную глубину, не перебирайте весь массив.

Это может быть полезно, например, если какая-то структура вынуждает вас иметь специальный метод или конструктор no-arg, который должен присутствовать, но вы не хотите, чтобы какой-либо разработчик вызывал этот метод напрямую. (Да, это хак, но иногда нечетные рамки заставляют вас делать странные вещи). Тогда у вас может быть утверждение в нежелательном методе, который просто генерирует исключение, если он вызван неправильным углом вашего кода.

В любом случае вам следует попытаться избежать подобных вещей, если это возможно.

1
public class A { 

    public void aMethod() { 
     if(this.getClass() == B.class){ 
      System.out.println("huhuhuuuuuuuuuuuuuuuuu"); 
     } 
    } 
} 

public class B extends A { 


} 

public class C { 

    public static void main(String[] args) { 
     B b = new B(); 
     b.aMethod(); 
    } 
} 
Смежные вопросы