Вы можете использовать отражение, чтобы проверить, какие методы B
объявляет.Обратите внимание, что существует 2 разновидности:
B.getClass().getMethods()
Предоставит вам массив Method
объектов, представляющих все открытые методы класса, включая объявленные классом или интерфейсом и наследуемые от суперклассов и суперинтерфейсов..
Вы также можете вызвать
B.getClass().getDeclaredMethods()
. Вы получите массив, содержащий объекты метода, отражающие все объявленные методы класса, включая открытый, защищенный, доступ по умолчанию (пакет) и закрытыйметоды, , но исключая унаследованные методы .
Не то чтобы в вашем случае класс A
не имел формы с двумя аргументами methodOne
, поэтому он технически не может быть унаследован или переопределен вB
.
Таким образом, вы можете вызвать getDeclaredMethods()
и перебрать массив объектов Method
, чтобы увидеть, имеет ли B
форму с двумя аргументами methodOne
.
Это работает , даже если вы объявили объект типа A, но создали его экземпляр с помощью new B()
.
Следующий пример кода показывает его в действии:
public abstract class A {
public abstract int methodOne (int n);
public abstract int methodTwo (int n);
}
public class B extends A {
@Override
public int methodOne(int n) {
return n;
}
public int methodOne(int n, int k) {
return n + k;
}
@Override
public int methodTwo(int n) {
return n * 2;
}
}
// test it out (note that this can throw several different exceptions
// so you'll have to handle them..I left that out to keep the code
// concise.
A a = new B();
Method[] methods = a.getClass().getDeclaredMethods();
for(Method m : methods) {
System.out.println(m.toGenericString());
if(m.getName().equals("methodOne") && m.getParameterCount() == 2) {
int result = (int)m.invoke(a, 3, 2);
System.out.println("Result = " + result);
}
}
Thisраспечатаетследующее:
public int B.methodTwo(int)
public int B.methodOne(int,int)
Result = 5
public int B.methodOne(int)