java - GetDeclaredMethods (java) 中的问题

标签 java reflection inheritance

我的代码有一个小问题

我有两个类

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/

相关文章:

c++ - 使用具有继承性的构造函数基类和成员初始值设定项列表

java - Emma 没有将源代码嵌入到 html 报告中

java - 扁线代替波浪

java - 自定义 CacheInterceptor 被默认 Spring 的 CacheInterceptor 覆盖

reflection - 如何使用反射初始化结构值字段?

c# - 获取接口(interface)属性的运行时 getter

c++ - 我可以在基类中重载纯虚方法吗?

java - Parcelable 对象列表的包裹列表

java - 注释处理的正确位置在哪里?

c++ - 理解策略模式