我的代码有一个小问题
我有两个类
public class A {
public A foo(int a) {return new A();}
}
public class B extends A{
public B foo(int x){ return new B();}
}
现在在我的代码中我只想打印在类 B 中声明的方法
这样
B b = new B();
Method[] m = b.getClass().getDeclaredMethods();
for (int i = 0; i < m.length; i++) {
System.out.print(m[i].getName());
}
为什么输出是
foo
foo
为什么 GetDeclaredMethods 也在 A 类中找到 foo? 我该如何修复它?
谢谢
最佳答案
您遇到问题的原因是两个方法的协变返回类型。因为您有一个协变返回类型(B 的返回类型是 B,而不是 A,与父类(super class)不同),Java 在底层会生成一个具有原始返回类型的单独方法,以充当 1.5 之前的字节码规范和新的 Java 1.5 语言行为之间的桥梁。
您应该用来检查的方法是 isBridge()
方法,因为它准确地表达了您想要排除的内容。所以最终的代码看起来像这样:
Method[] methods = B.class.getDeclaredMethods();
for (Method method : methods) {
if (!method.isBridge()) {
System.out.println(method.getName());
}
}
关于java - GetDeclaredMethods (java) 中的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44640160/