繁体   English   中英

捕获的被叫方法属于哪个类

[英]Catching called method belongs to which class

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

查看我更新的查询。 他们要求的就是这种情况。

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()方法。 注意,这个问题不是出于调试目的-这是理论上的。

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

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

尝试这个。

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);
       }
      }
    }

您将从MethodContainerC调用display() ,从而Display from MethodContainerC打印输出Display from MethodContainerC

这是重写的工作方式:如果要调用超类的方法,则需要从重写的方法内部显式调用super 否则,您将调用重写的方法。

但是,如果MethodContainerC没有方法display() ,则将调用MethodContainerB的display方法。 这是因为继承遵循最接近的路径:

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

如果切出最后一步,则MethodContainerB仍将覆盖所有MethodContainerC display() 该方法的最接近的实现将始终运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM