Проверьте, сколько аргументов у метода есть на Java - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть несколько классов, расширяющих абстрактный класс A.

Абстрактный класс имеет следующие методы:

public abstract int methodOne (int n);
public abstract int methodTwo (int n);

Один из классов, класс B, который расширяет класс A по сравнению с одним из методов, например:

public int methodOne (int n) {
    return n * 2;
}

public int methodOne (int n, int k) {
    return n * k;
}

Теперь мы работаем с экземплярами класса B, есть ли способ проверить, не перегружен ли метод "methodOne" и, если затем, сделать условие.

A ourTest = new B();

Если methodOne имеет два аргумента, тогда используйте метод с двумя аргументами, в противном случае используйте methodOne с одним аргументом.

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

У вас нет одного и того же метода с одним или двумя аргументами.Оба метода различны, но имеют одно и то же имя (methodOne).Если вы хотите узнать, сколько аргументов имеет метод, или если он был перегружен, доступен Java Reflection API.Но вы пытаетесь сделать, кажется, нет смысла.

0 голосов
/ 16 ноября 2018

Если methodOne имеет два аргумента, используйте метод с двумя аргументами, в противном случае используйте methodOne с одним аргументом.

Нет, вы не можете этого сделать, потому что Javaстатически типизированный.

Поскольку A определяет только версию methodOne с одним аргументом, это все, что у вас когда-либо будет для кода, использующего переменные типа A.

Любой метод, добавленный к подклассам, не виден в простом коде Java для переменных типа A.Такие «дополнительные» методы можно вызывать только путем приведения к соответствующему подклассу или с помощью отражения.

0 голосов
/ 15 ноября 2018

Вы можете использовать отражение, чтобы проверить, какие методы 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)
...