【问题标题】:How can I get the implementing class for a given method?如何获取给定方法的实现类?
【发布时间】:2012-01-13 15:40:26
【问题描述】:

给定几个类/接口。

public interface A {
    public int doSomthing(int x);
}

public class B implements A {
    int doSomthing(int x){
        //actually do something
    };
}

public class C extends B {
    //does some specific implementations of what B does
    // but does NOT override "int doSomething(int)"
}

如何在使用实现 C(或 C 的任何子类)的代码中(以编程方式)确定 B 是实现 int doSomething(int) 的类。

或者如果 B 的任何子类(假设 D 扩展 C)覆盖“int doSomething(int)”,当使用 E(扩展 D,是的......这是一大类类)时,我可以定义实现“int doSomething(int)”的第一个父级?

提前谢谢大家:)

【问题讨论】:

  • 为什么你需要知道这个?你通常不应该关心这个。如果你有一个 A 的实例,你知道它可能会调用 doSomething。这就是多态性的全部意义所在。无论如何,我认为这就是你要找的东西:docs.oracle.com/javase/6/docs/api/java/lang/reflect/…
  • 你的意思是在方法内部做System.out.println(getClass().getName());之类的事情?
  • @stacker 是的,应该明确编辑帖子谢谢! @ JBNizet 我(几乎)完全了解多态性的意义,并且非常了解继承的工作原理,但是在某些情况下,您希望使用比当前特定类公开和声明的方法更多的标准方法。 @ Viruzzo 比这要复杂一些,但谢谢。

标签: java inheritance object overriding introspection


【解决方案1】:

您可以使用反射来做到这一点,即您从对象拥有的类开始并检查该类是否定义了由方法名和参数类型标识的方法。如果该类未定义该方法,则获取其超类并检查它,直到您点击Object,在这种情况下该方法根本不可用。

对于公共方法,这更容易,因为 Java 已经为此提供了内置方法:

Class<?> mostSpecificImplementor = 
  yourObject.getClass().getMethod( "doSomthing", int.class ).getDeclaringClass();

请注意,这仅适用于公共方法,否则您必须自己搜索类层次结构(在这种情况下使用 getDeclaredMethod(...))。

【讨论】:

    猜你喜欢
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多