0

我的查询是假设我们有多个类假设三个类是这样的:

请参阅我更新的查询。这就是他们要求的情况。

class MethodContainerA {
    public void display() {
        System.out.println("Display from MethodContainerA");
    }
}

class MethodContainerB extends MethodContainerA {
    public void display() {
        System.out.println("Display from MethodContainerB");
    }
}

class MethodContainerC extends MethodContainerB {

}

public class MethodCallRecognization {
    public static void main(String[] args) {
        MethodContainerC methodContainerC = new MethodContainerC();
        methodContainerC.display();

            // I want to know here
    }
}

我的问题是,调用后我能得到信息display()方法是从哪个类调用的。请注意,这个问题不是用于调试目的 - 它是理论上的。

4

3 回答 3

3

好吧,实际上可能有一种方法可以做到这一点(没有尝试过):

获取使用的实例的类。执行 getDeclaredMethod 以获取方法。在方法上执行 getDeclaringClass。

于 2013-04-24T16:55:18.417 回答
2

试试这个。

public class MethodCallRecognization {
  public static void main(String[] args) {
    MethodContainerC methodContainerC = new MethodContainerC();
    methodContainerC.display();
    // I want to know here
    String className=getClassName(methodContainerC.getClass(), "display") ;
    System.out.println(className);
  }
  public static String getClassName(Class c,String methodName){
       Method m[]=c.getDeclaredMethods();
       for(Method m1:m){
        if(m1.getName().equals(methodName)){
            return c.getName();
        }
       }
       return getClassName(c.getSuperclass(),methodName);

  }
}

如果方法被重载,您还需要检查参数类型而不是名称。但这应该给你的想法。

根据评论这里是更好的版本getClassName

public static String getClassname(Class c, String methodName){
 try{
  Method m= c.getDeclaredMethod( methodName);
  return c.getName();
}catch(NoSuchMethodException  nse){
   return getClassName(c.getSuperclass(),methodName);
}
}

如果 dsiplay 方法采用参数,则

 public class MethodCallRecognization {
      public static void main(String[] args) {
        MethodContainerC methodContainerC = new MethodContainerC();
        methodContainerC.display("" , "");//Suppose it takes String id and String name parameter 
        // I want to know here
         Class[] parametertype={String.class,String.class};
        String className=getClassName(methodContainerC.getClass(), "display", parametertype) ;
        System.out.println(className);
      }
      public static String getClassname(Class c, String methodName, Class[] parametertype){
        try{
           Method m= c.getDeclaredMethod( methodName, parametertype);
           return c.getName();
        }catch(NoSuchMethodException  nse){
          return getClassName(c.getSuperclass(),methodName, parametertype);
       }
      }
    }
于 2013-04-24T16:54:37.820 回答
1

您将从 调用display()MethodContainerC因此将打印出来Display from MethodContainerC

这就是覆盖的工作方式:如果你想调用超类的方法,你需要super从被覆盖的方法中显式调用。否则,您将调用被覆盖的方法。

但是,如果您在 中没有方法display()MethodContainerC您将改为调用MethodContainerB的显示方法。这是因为继承遵循最近的路径:

  • MethodContianerA有方法display()...
  • 它被MethodContainerB...覆盖
  • (被MethodContianerC. 覆盖)

如果您删除了最后一步,MethodContainerB仍然会覆盖display()所有MethodContainerC. 该方法的最接近的实现将始终运行。

于 2013-04-24T16:43:41.663 回答