我有多个扩展抽象类 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/