java - 检查 Java 方法有多少个参数

标签 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

最佳答案

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

B.getClass().getMethods()

会给你一个数组 Method表示类的所有公共(public)方法的对象,包括由类或接口(interface)声明的方法以及从父类(super class)和超接口(interface)继承的方法。

您也可以调用

B.getClass().getDeclaredMethods()

将为您提供一个包含 Method 对象的数组,该对象反射(reflect)了类的所有声明方法,包括公共(public)方法、 protected 方法、默认(包)访问方法和私有(private)方法,但不包括继承方法

在你的情况下,类 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)

关于java - 检查 Java 方法有多少个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53327489/

相关文章:

java - 如何从目录和子目录中获取ftl文件

go - 如何调用 golang struct 字段的函数?

java - 如何记录一个接口(interface)所有实现的每个方法的时间成本

groovy - groovy 中的方法重载

c++ - 如何覆盖||在 C++ 中

Java 方法重载 - 两个列表

java - :commandLink not firing file download action without f:ajax

java - gradle判断windows系统是32位还是64位

java.sql.SQLException : Invalid argument(s) in call: Use setNull for user-defined types and REF types

Javascript:将方法添加到函数原型(prototype)