Как я могу получить класс реализации для данного метода? - PullRequest
0 голосов
/ 13 января 2012

Учитывая несколько классов / интерфейсов.

public interface A {
    public int doSomthing(int x);
}

public class B implements A {
    int doSomthing(int x){
        //actually do something
    };
}

public class C extends B {
    //does some specific implementations of what B does
    // but does NOT override "int doSomething(int)"
}

Как в коде, использующем реализацию C (или любой подкласс C), можно определить (программно), что B был классом, реализующим int doSomething (int).

Или, если какой-либо из подклассов B (скажем, D, который расширяет C) переопределяет "int doSomething (int)", как при работе с E (который расширяет D, да ... это одно большое семейство классов) я могу определить первого родителя, который реализовал "int doSomething (int)"?

Спасибо всем заранее:)

1 Ответ

3 голосов
/ 13 января 2012

Вы можете сделать это, используя отражение, то есть вы начинаете с класса, который есть у объекта, и проверяете, определяет ли этот класс метод, который идентифицируется по имени метода и типам параметров. Если класс не определяет этот метод, вы получаете его суперкласс и проверяете его, пока не нажмете Object, в этом случае метод вообще не доступен.

Для открытых методов это проще, поскольку в Java уже есть встроенный метод для этого:

Class<?> mostSpecificImplementor = 
  yourObject.getClass().getMethod( "doSomthing", int.class ).getDeclaringClass();

Обратите внимание, что это работает только для открытых методов, в противном случае вам придется искать иерархию классов самостоятельно (в этом случае используйте getDeclaredMethod(...)).

...