检查一个方法在Java上有多少个参数

时间:2018-11-15 20:32:32

标签: java methods overloading

我有多个扩展抽象类A的类。

抽象类具有以下方法:

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

扩展类A的类之一,即类B,覆盖了以下方法之一,例如:

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 :(得分:1)

您可以使用反射来检查B声明的方法。请注意,有2种口味:

B.getClass().getMethods()

将为您提供Method对象的数组,这些对象代表该类的所有公共方法,包括由类或接口声明的对象以及从超类和超接口继承的对象。

您也可以致电

B.getClass().getDeclaredMethods()

将为您提供一个包含Method对象的数组,该对象反映该类的所有已声明方法,包括public,protected,默认(程序包)访问和私有方法,但不包括继承的方法

并非如此,类A没有methodOne的2自变量形式,因此从技术上讲,不能在B中继承或覆盖它。

因此,您可以调用getDeclaredMethods()并遍历Method对象的数组,以查看B是否具有2个参数形式的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);
    }
}

这将打印以下内容:

public int B.methodTwo(int)
public int B.methodOne(int,int)
Result = 5
public int B.methodOne(int)

答案 1 :(得分:0)

您没有带有一个或两个参数的相同方法。两种方法虽然名称相同(methodOne),但均不同。如果要查找一个方法有多少个自变量,或者是否要重载该方法,可以使用Java Reflection API。但是您尝试这样做似乎没有任何意义。

答案 2 :(得分:0)

  

如果methodOne有两个参数,则将方法与两个参数一起使用,否则将methodOne与一个参数一起使用。

不,您不能这样做,因为Java是静态类型的。

由于A仅定义了methodOne的单参数版本,所以对于使用A类型的变量的代码,这就是您所拥有的。

添加到子类中的任何方法在普通Java代码中都不可见,类型为A的变量。您只能通过强制转换为相关子类或使用反射来调用此类“额外”方法。